找到丟失的數字
現在你手上有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 擴充套件問題,如果丟失兩個,並找出這兩個數字 或者,丟失三個,找出三個中的任意...