題目:在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。
例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
思路:我們注意到,陣列中的數字都在0到n-1
範圍內。如果這個陣列中沒有重複的數字,那麼當陣列排序後,數字i
就會出現在索引為i
的位置上。但是現在是陣列中有重複的數字,有些位置上可能存在多個數字,有些位置上沒有數字。
從頭到尾掃瞄這個陣列中的每個數字,當掃瞄到下標為i
的數字時,首先比較這個數字(記為m
)和下標
i
是否相等,若相等,接著掃瞄下乙個數字;若不相等,則將m
與索引為m
上的數字進行比較。如果它與第m
個數字相等,就找到了乙個重複的數字;若不相等,則將第i
個數字和第m
個數字交換,把m
放在屬於它的位置上。接下來便是重複比較下去,直到發現乙個重複的數字。
舉例說明:
#include using namespace std;
class solution
// 判斷陣列中元素是否合法
for(int i = 0; i < length; i++)
}// 遍歷查詢第乙個重複的數
for(int i = 0; i < length; i++)
swap(numbers[i], numbers[numbers[i]]);}}
return false;
}};int main()
; solution b;
int c = 0;
b.duplicate(a, 7, &c);
cout << c << endl;
return 0;
}
如何在給定的整數陣列中找到重複的數字
最先湧現的想法是遍歷一遍陣列,用hash表記錄每乙個數字出現的次數 用空間換時間 劍指offer解法 重新排序陣列每個數字,當掃瞄到數字m的時候判斷下標為i的數字是否等於m 如果是,就尋找下乙個 如果不是,就判斷下標為m的對應的數字是否等於m,如果它與第m個數字相等,就等於找到了乙個重複的數字,如果...
隨機整數陣列去重與排序
明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 1000 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序...
C語言 整數陣列去重並排序
一 c語言中自有的qsort 函式 功能 使用快速排序對要排序的物件進行排序 原型 void qsort void base,int nelem,int width,int fcmp const void const void 引數介紹 1 待排序陣列的首位址 2 待排序陣列中元素的個數 3 各個元...