1. 程式人生 > 其它 >03-2 陣列中重複數字(不改變原陣列)

03-2 陣列中重複數字(不改變原陣列)

一個長度為n + 1的數組裡面的所有數字都在1 ~ n的範圍內,所以陣列中至少有一個數字是重複的。請找出陣列中任意一個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列{7,7,5,4,2,6,1,3},那麼對應輸出的應該是7。

1,官方解答

/*先將元素劃分為兩部分,計算前面部分的元素在整個陣列中出現的次數,如果出現次數大於元素個數,
*則重複數字在這一部分,否則在另一部分,重複以上步驟即可*/ 
#include <iostream>
using namespace std;
#define nullptr NULL 

int countRange(const int
*numbers,int length,int start,int end){ if(numbers == nullptr) return 0; int count = 0; for(int i = 0;i < length;i++){ //計算在[start,end]之間的元素在整個陣列內的出現次數 if(numbers[i] >= start && numbers[i] <= end) ++count; } return count; }
int GetDuplication(const int *numbers,int length){ if(numbers == nullptr || length <= 0) return -1; int start = 1; //題目限定範圍為1 ~ n,所以劃分的時候起始位置為1 int end = length - 1; //所以start和end在這裡並不是作為陣列下標,而是作為劃分的起始和結束位置 while(end >= start){ int
middle = ((end - start) >> 1) + start; int count = countRange(numbers,length,start,middle); //獲得元素出現次數之和 if(end == start){ if(count > 1) return start; else break; } //當前劃分含有重複數字時,下一個迴圈就是對該劃分進行二次劃分 if(count > (middle- start + 1)) end = middle; else start = middle + 1; //否則就對另一個劃分進行二次劃分 } return -1; } int main(){ int array[8] = {7,7,5,4,2,6,1,3}; cout<<GetDuplication(array,8); return 0; }