牛客網——陣列中重複的數字
阿新 • • 發佈:2018-11-02
題目描述
在一個長度為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了,那麼直接返回這個數即可。