1. 程式人生 > >牛客網——陣列中重複的數字

牛客網——陣列中重複的數字

題目描述
在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知
道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。
 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2。

智力是硬傷啊,看我寫的暴力解法和別人的比一下實在。。。。

package 劍指offer;

/**
 * Created by Administrator on 2018/10/31.
 */
public class 陣列中重複的數字 {
    public static boolean duplicate(int numbers[],int length,int [] duplication) {
        for(int i=0;i<length;i++){
            if(numbers[i]==i)
                continue;
            int tmp=numbers[i];
            numbers[i]=-1;
            int pos=swap(numbers,length,duplication,tmp);
            if(pos==-2){
                return true;
            }
            numbers[i]=i;
        }
        return false;
    }

    private static int swap(int num[],int length,int[] dup,int pos){
        if(num[pos]==-1)
            return -1;
        if(num[pos]==pos){
            dup[0]=pos;
            return -2;
        }
        int tmp=num[pos];
        num[pos]=pos;
        return swap(num,length,dup,tmp);
    }
    public static  void main(String[] args){
        int []num={2,3,1,0,3,5,3};
        int[] dup=new int[1];
        System.out.println(duplicate(num,7,dup)+","+dup[0]);
    }
}

大佬的解法

連結:https://www.nowcoder.com/questionTerminal/623a5ac0ea5b4e5f95552655361ae0a8
來源:牛客網

int find_dup( int numbers[], int length) {

    for ( int i= 0 ; i<length; i++) {

        int index = numbers[i];

        if (index >= length) {

            index -= length;

        }   

        if (numbers[index] >= length) {

            return index;

        }   

        numbers[index] = numbers[index] + length;

    }   

    return - 1 ; 

}

連結:https://www.nowcoder.com/questionTerminal/623a5ac0ea5b4e5f95552655361ae0a8
來源:牛客網

不需要額外的陣列或者hash table來儲存,題目裡寫了數組裡數字的範圍保證在0 ~ n-1 之間,所以可以利用現有陣列設定標誌,當一個數字被訪問過後,可以設定對應位上的數 + n,之後再遇到相同的數時,會發現對應位上的數已經大於等於n了,那麼直接返回這個數即可。