劍指Offer 不修改陣列找出重複的數字

2021-08-19 13:32:12 字數 2032 閱讀 6723

在乙個長度為n+1的陣列裡,所有的數字都在1~n的範圍內,所以陣列中至少有乙個數字是重複的(因為長度為n+1,而1~n只有n個數字,也就是說就算每個數字不一樣,都會空餘乙個位置,所以至少有乙個重複的數字)請找出陣列中任意乙個重複的數字,但是不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應輸出的數字應該是2或者3。

思路一:我們可以利用上篇部落格的方式,建立乙個新的陣列。對這個新陣列進行上篇部落格的操作。將陣列每個元素交換至其對應的角標下。以此類推,每次交換前判斷對應角標下元素值。

#include 

#include

int findsamenum(int* tmp, int sz)

int i = 0;

for(; i < sz; ++i)

tmp[i] = tmp[cur];

tmp[cur] = cur;

}} return -1;

}int main()

; int sz = sizeof(arr)/sizeof(arr[0]);

int tmp[sz];

memmove(tmp, arr, sz);//利用memmove進行拷貝

int ret = findsamenum(tmp, sz);

printf("ret expected 2 or 3, ret actual %d\n",ret);

return

0;}

思路二:同樣是建立一片新的空間,並初始化為0。接著將原陣列的元素數值插入至新陣列角標為元素值的位置。插入前判斷該位置是否為0,如果為0則可以插入,不是0,就是重複元素。

#include 

int findsamenum(int* arr, int sz)

int i = 0;

int tmp[sz] = ;

for(; i < sz; ++i) else

} return -1;

}int main()

; int sz = sizeof(arr)/sizeof(arr[0]);

int ret = findsamenum(arr, sz);

printf("ret expected 2 or 3, ret actual %d\n",ret);

return

0;}

思路三:由於題目要求,陣列元素為1~n,我們將陣列以陣列元素值為分界分成兩部分,第一部分1~m,第二部分為m+1~n,如果陣列中元素值為1~m的元素出現了超過m次,那麼重複的數字一定在1~m之間。以此類推。類似於二分查詢。但是這個方法有一些侷限性。我們後面再說。

#include 

int count(int* arr, int sz, int start, int mid)

intcount = 0;

sz -= 1;

while(sz--)

} return

count;

}int findsamenum(int* arr, int sz)

int start = 1;

int end = sz - 1;

while(start <= end) else

}if(count > (mid - start + 1)) else

} return -1;

}int main()

; int sz = sizeof(arr)/sizeof(arr[0]);

int ret = findsamenum(arr, sz);

printf("ret expected 4, ret actual %d\n",ret);

return

0;}

侷限性:比如:在這裡陣列中,元素為2,3,5,4,3,2,6,7。這個時候這個陣列中的2是無法找出的,因為在1~2這個範圍內,有1和2兩個數字,而我們陣列中這個範圍內2恰好也出現了兩次,所以這個時候是無法判斷2的。所以我們這個演算法不能確定每個數字各出現了一次還是某個數字出現了兩次。

劍指offer題目 不修改陣列找出重複的數字

沒有在牛客網的oj上找到這個題目所以寫在部落格裡記錄一下 題目 在乙個長度為n 1的陣列裡的所有數字都在1 n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3.題目中說了不能改變輸入的陣...

劍指offer 不修改陣列找出重複的數字go語言版

題目描述 給定乙個長度為n 1的陣列nums,陣列中所有的數均在1 n 的範圍內,其中 n 1。請找出陣列中任意乙個重複的數,但不能修改輸入的陣列。樣例給定 nums 2,3,5,4,3,2,6,7 返回 2 或 3。思考題 如果只能使用 o 1 的額外空間,該怎麼做呢?題目思路 該題目主要使用二分...

劍指offer3 2 不修改陣列找出重複的數字

在乙個長度為n 1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的陣列。例如,如果輸入長度為8的陣列,那麼對應的輸出是重複的數字2或者3。public static boolean duplicate2 int numbers,...