《劍指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**)
執行![](https://pic.w3help.cc/341/73d7008e6f91ea814fe21ef801066.jpeg)
題目:在乙個長度為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**)
執行![](https://pic.w3help.cc/773/e6dec07fd1c35b490a15b14c7c2d8.jpeg)
總結:面試官提出的需求不同,最終所採用的演算法也不相同,這說明面試中和面試官的交流的重要性!!
我的碼雲:
陣列練習題
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...