面試題3 陣列中重複的數字

2021-10-05 16:32:12 字數 2243 閱讀 5584

面試題3:找出陣列中重複的數字。

在乙個長度為 n 的陣列 nums 裡的所有數字都在 0~n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。

示例 1:

輸入:[2, 3, 1, 0, 2, 5, 3]

輸出:2 或 3

限制:2 <= n <= 100000

利用雜湊的特性,但不需要額外的儲存空間。因此時間複雜度為o(n),不需要額外空間,空間複雜度o(1)!

把當前序列當成是乙個下標和下標對應值是相同的陣列;

遍歷陣列,判斷當前位的值和下標是否相等: 2.1. 若相等,則遍歷下一位; 2.2. 若不等,則將當前位置i上的元素和a[i]位置上的元素比較:若它們相等,則成功!若不等,則將它們兩交換。換完之後a[i]位置上的值和它的下標是對應的,但i位置上的元素和下標並不一定對應;重複2.2的操作,直到當前位置i的值也為i,將i向後移一位,再重複2.。

如果沒有重複數字,那麼正常排序後,數字i應該在下標為i的位置,所以思路是重頭掃瞄陣列,遇到下標為i的數字如果不是i的話,(假設為m),那麼我們就拿與下標m的數字交換。在交換過程中,如果有重複的數字發生,那麼終止返回ture

class

solution

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

for(

int i =

0; i < length; i++

)else}}

return

false

;// 若上述條件均無返回,則直接返回flase(表明陣列中並無重複的數字)

}

,和題51類似

因此時間複雜度為o(n),不需要額外空間,空間複雜度o(n)

class

solution

for(

int i =

0; i < nums.

size()

;++i)

return0;

}};

// 面試題3(二):不修改陣列找出重複的數字(和t61思路類似)

// 題目:在乙個長度為n+1的陣列裡的所有數字都在1到n的範圍內,所以陣列中至

// 少有乙個數字是重複的。請找出陣列中任意乙個重複的數字,但不能修改輸入的

// 陣列。例如,如果輸入長度為8的陣列,那麼對應的

// 輸出是重複的數字2或者3。

#include

intcountrange

(const

int* numbers,

int length,

int start,

int end)

;// 引數:

// numbers: 乙個整數陣列

// length: 陣列的長度

// 返回值:

// 正數 - 輸入有效,並且陣列中存在重複的數字,返回值為重複的數字

// 負數 - 輸入無效,或者陣列中沒有重複的數字

intgetduplication

(const

int* numbers,

int length)

if(count >

(middle - start +1)

) end = middle;

else

start = middle +1;

}return-1

;}intcountrange

(const

int* numbers,

int length,

int start,

int end)

// ********************測試**********************

void

test

(const

char

* testname,

int* numbers,

int length,

int* duplications,

int duplength)

} std::cout << testname <<

" failed."

<< std::endl;

}

面試題3 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0 n 1範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。1.方法一 把輸入的資料進行排序,排序後再判斷有無重複的數字,時間複雜...

面試題3 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。雜湊表int findduplicatenum vector int...

面試題3 陣列中重複的數字

leetcode面試題3 思路1 建立乙個陣列,將原陣列元素當做下標統計次數 int findrepeatnumber int nums,int numssize count times for int i 0 i numssize i no such element return 1 思路2 排序...