C C 練習題 陣列中重複的數字

2021-09-25 10:17:18 字數 2984 閱讀 1861

《劍指offer》面試題3

題目:在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,

也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,

那麼對應的輸出是重複的數字2或者3。

分析:陣列的長度(n)等於數字的範圍(0~n-1),如果使用陣列下標來定位陣列中數字的話,會出現兩種情況

沒有重複數字:每乙個位置剛好對應乙個數字,排序後的陣列元素的值和下標一一對應

有重複數字:有些位置可能會出現多個數字,有些位置可能沒有數字

演算法思想:重排陣列,把元素放置在指定的位置。通過遍歷陣列的每乙個元素,

如果陣列元素的值等於下標值,繼續遍歷下乙個元素

如果陣列元素的值不等於下標值,根據元素的值找到對應的位置,進行比較,再根據比較結果判斷

比較值相等,找出重複數字,返回

比較值不等,進行位置交換

繼續判斷陣列元素的值....

其他方法:

1.對陣列排序,在已排序的陣列中掃瞄重複數字

2.建立雜湊表,通過判斷新加入的數字在雜湊表中是否已存在,來判斷重複數字

**

#include "iostream"

using namespace std;

//函式功能:尋找陣列中的任意重複數字

//輸入引數:numbers 源陣列、length 陣列長度、duplication 重複元素

//返回值: false 沒有重複數字、true發現重複數字

bool duplicate(int numbers, int length, int* duplication)

//判斷元素數是否滿足

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

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

//5.交換當前值到下標位置

int temp = numbers[i];

numbers[i] = numbers[temp];

numbers[temp] = temp;

} }return false; //沒有找到

}//進行測試

void test01()

; int duplication = 0;

if ( duplicate(numbers, sizeof(numbers)/sizeof(int), &duplication) == true ) }

int main(int argc, char const *ar**)

執行

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

分析:陣列長度(n+1)大於數字的範圍,所以一定有重複的數字。使用二分法的思路,將不斷小查詢區間的範圍,對重複數字進行查詢。

其他方法:建立乙個輔助陣列,在輔助陣列中查詢重複數字,不會破壞原陣列的結構。

**

#include "iostream"

using namespace std;

int countrange(const int* numbers, int length, int start, int end); //統計次數

int getduplication(const int* numbers, int length); //查詢任意重複數字

//功能:(已知)陣列內有重複數字,查詢重複數字

//輸入:numbers源陣列(數字範圍1-n)、length陣列長度(n+1)

//返回:重複的數字

int getduplication(const int* numbers, int length)

int start = 1;

int end = length - 1;

while(start <= end)

else

}//4.重新調整區間,區間內包含重複數字

if ( count > ((middle - start) + 1) )

else

} return -1;

}//功能:統計start-end範圍的數字的出現次數

//輸入:numbers源陣列、length陣列長度、start,end表示數字範圍

int countrange(const int* numbers, int length, int start, int end)

int count = 0;

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

return count;

}void test01()

; int res = getduplication(arr, sizeof(arr)/sizeof(int));

cout << "res:" << res << endl;

}int main(int argc, char const *ar**)

執行

總結:面試官提出的需求不同,最終所採用的演算法也不相同,這說明面試中和面試官的交流的重要性!!

我的碼雲

陣列練習題

2 隨機生成乙個五位以內的數,然後輸出該數共有多少位,每位分別是什麼 3 開發乙個標題為 flipflop 的遊戲應用程式。它從1計數到100,遇到3的倍數就替換為單詞 flip 5的倍數就替換為單詞 flop 既為3的倍數又為5的倍數則替換為單詞 flipflop 5 生成13位條形碼 ean 1...

陣列練習題 刪除排序陣列中的重複項

習題內容 給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被...

陣列的練習題

練習1 從乙個整數陣列中取出最大的整數,最小整數,總和,平均值 宣告乙個int型別的陣列 並且隨意的賦初值 int nums 宣告兩個變數用來儲存最大值和最小值 int max int.minvalue nums 3 minvalue int所能表示的最小值 int min int.maxvalue...