1. 程式人生 > >51、數組中重復的數

51、數組中重復的數

範圍 point amp isp hid equal null code n-1

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

https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&tPage=3&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

思路:

 把數值放到對應的下標下,若對應的下標的元素和該值相等,出現重復。

註意:檢查數組的值在0-n-1內

技術分享
public class Solution {
    // Parameters:
    //    numbers:     an array of integers
    //    length:      the length of array numbers
    //    duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
    
// Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++ // 這裏要特別註意~返回任意重復的一個,賦值duplication[0] // Return value: true if the input is valid, and there are some duplications in the array number // otherwise false public boolean
duplicate(int numbers[],int length,int [] duplication) { //way1.排序然後遍歷時間O(nlogn) //way2.hashmap,o(n)的時間,o(n)的空間 //way3.遍歷數組和當前下標比較,並交換放到對於的下標下,直到發現重復的數。o(n)的時間,o(1)的空間 if (numbers == null || numbers.length == 0) { return false; } for (int i = 0; i < numbers.length; i++) { //數字都在0到n-1的範圍內 if (numbers[i] < 0 || numbers[i] >= numbers.length ) { return false; } } for (int i = 0; i < numbers.length; i++) { //如果當前值和下標相等,就下一個 if (numbers[i] == i) { continue; } //當前值和下標不等,且發現,當前值和對於下標的值相等,發現重復的數 if (numbers[i] == numbers[numbers[i]]){ duplication[0] = numbers[i]; return true; } //將當前值放到對應的下標位置 int temp = numbers[i]; numbers[i] = numbers[temp]; numbers[temp] = temp; } return false; } }
View Code

測試:沒有重復的元素;重復的元素有多個;重復的元素是最大或最小;數組元素不在0-n-1

51、數組中重復的數