面試題 找到1 n中丟失的數字及其變形題

2021-10-02 22:59:59 字數 1407 閱讀 9218

找到丟失的數字

現在你手上有n-1個數字,這些數字的範圍是 [1 , n]

問題1:

如果這n-1個數字中沒有重複的數字,你手上的數字丟失了乙個。請編寫一段高效的找到該缺失數字的**。

問題2:

如何這n-1個數字中,有的數字出現了2次,有的數字出現了1次,有的數字沒有出現,請編寫一段高效的找到該缺失數字的**。

問題1的解:

這裡提供兩種思路:

方法一:先求和,然後減去每乙個數字。算是效率比較高的了。

方法二:異或:(以後會專門開一章講解如何巧妙的用異或解決各種各樣的題)

首先:

計算機最後去做加減乘除的時候都是做的二進位制。

所以如果有n個數字,只缺失乙個的話。我們可以這麼做:

1 ^ 2 ^ 3 … ^ n ^ a1 ^ a2 ^ a3 … ^ an(其中ai是我們輸入的數),最後得出來的就是那個缺失的值。——因為乙個數字異或本身會等於0(a ^ a=0),當所有的數字都找到對應的ai了,只有缺失的那個數字會異或0(a ^ 0=a)。

問題2的解:

這裡直接講乙個高效的方法了,其實就是用下標當另外乙個陣列。

首先遍歷整個陣列,如果第乙個數字是3,那麼我們就把第三個位置變為負數,如果第二次再遇到3,我們就不用再改變了,遍歷完整個陣列後,已經出現的數字,在對應的位置上都會變成負數,還是正數的數字,它的位置的序號就是沒有出現過的數字。

比如說:[4,3,4,5,1]

第乙個數是4,我們把第四個位置也就是5所在的位置變為-5,——>[4,3,4,-5,1]

第二個數是3,就把第三個位置也就是第二個4所在的位置變為-4,——>[4,3,-4,-5,1]

第三個數是4,第四個位置已經是-5,是負數了,就不需要再變。

第四個數是5,把第五個位置也就是1所在的位置變為-1,——>[4,3,-5,-1]

第五個數是1,把第乙個位置也就是第乙個4所在的位置變為-4,——>[-4,3,-5,-1]

遍歷完成。

可以看到只有3是整數,3處於第二個位置,所以2是沒有出現過的數字。

這裡附上python實現**:

def

(nums)

:for i in

range

(len

(nums)):

index =

abs(nums[i])-

1 nums[index]=-

abs(nums[index]

)#當第一元素是3,就把第三個位置的數設定成負數

return

[i +

1for i in

range

(len

(nums)

)if nums[i]

>

0]

面試題 0 n 1中缺失的數字

乙個長度為n 1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0 n 1之內。在範圍0 n 1內的n個數字中有且只有乙個數字不再該陣列中,請找出這個數字。思路 可選有n個,長度為n 1,不重複還遞增,那麼第乙個下標與值不等的就是結果咯。顯然,還是二分的節奏。int getmissingn...

面試題之尋找丟失的數字

據傳說是ms google等等it名企業的面試題 有一組數字,從1到n,中減少了乙個數,順序也被打亂,放在乙個n 1的陣列裡 請找出丟失的數字,最好能有程式,最好演算法比較快 btw1 有很多種方法的哦,據說o n 的方法就不止一種 btw2 擴充套件問題,如果丟失了2個數字呢?btw3 一定要小心...

MS Google面試題 尋找丟失的數字

題目 有一組數字,從1到n,其中丟失了乙個數字,且順序也被打亂的儲存在乙個 size 為n 1的陣列中 要求 找出丟失的數字,最好能有程式,最好演算法比較快 btw1 有很多種方法哦,據說o n 的方法不止一種 btw2 擴充套件問題,如果丟失兩個,並找出這兩個數字 或者,丟失三個,找出三個中的任意...