面試題之尋找丟失的數字

2021-05-06 07:03:05 字數 1278 閱讀 6102

據傳說是ms/google等等it名企業的面試題:

有一組數字,從1到n,中減少了乙個數,順序也被打亂,放在乙個n-1的陣列裡

請找出丟失的數字,最好能有程式,最好演算法比較快

btw1: 有很多種方法的哦,據說o(n)的方法就不止一種

btw2: 擴充套件問題,如果丟失了2個數字呢?

btw3: 一定要小心不要溢位,嗯,面試者有時候不會提醒你的

btw4: 最好不要多申請n多空間

update乙個很相近的題目:1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?

題目

給你n個數,其中有且僅有乙個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那乙個數。

給你n個數,其中有且僅有兩個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那兩個數。

現在這裡給出一些解答:

第一題: 看到題目的第一反應就是把這個n-1個數字加起來,然後和1+2+3..+n的和進行比較,那個差值就是迷失的數字。但是這個方法正是btw3裡面提到的不要溢位:)所以有一定的風險,還是不採用,還有人說用乙個個+-來判斷,可以是可以但是**寫起來也比較難看(個人感覺),還是異或操作符來的最合適一些。 我們知道1^1=0;2^2=0;n^n=0;k^0=k;所以如果我們把這n-1個數字異或起來,再來異或一下1,2,..n。那麼最終的答案肯定是迷失數字k^(1^1)^(2^2)...^(n^n)。也就是k了。我們很容易地寫下來了函式:

第二個問題來的更複雜一些,如果有兩個數字迷失怎麼辦?還是方法一的方法,但是需要衍生一下。假定我們迷失的數字是s1,s2那麼我們全部異或之後得到的就是s1^s2只有的值。分析一下就可以知道,s1!=s2,也就是說s1^s2!=0; 這樣也就是說s1^s2的這個值有二進位制位有一位是1,那麼我們就可以把這些所有的數字分成2組,一組這個二進位制位是1,另乙個這個二進位制位是0的來重新做異或。這樣就可以吧其中乙個s1求出來了,那再s1^(s1^s2)一下,s2也就得到了。類似地,我們寫下了如下的**:

還找了個test case 測試了一把:

看起來兩個函式執行的結論是正確的。

後面的問題,update確實如上所說的,非常類似,把這些個數字和1-1000異或就得到了答案了。奇數偶數的其實問題的第一二小題分別和迷失乙個數字和兩個數字對應,想法完全一致,這裡不做展開了。

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

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

Java面試題 尋找coder

請設計乙個高效演算法,再給定的字串陣列中,找到包含 coder 的字串 不區分大小寫 並將其作為乙個新的陣列返回。結果字串的順序按照 coder 出現的次數遞減排列,若兩個串中 coder 出現的次數相同,則保持他們在原陣列中的位置關係。給定乙個字串陣列a和它的大小n,請返回結果陣列。保證原陣列大小...

LeetCode 尋找丟失的數字

給定乙個包含 0,n 中n個數的陣列nums,找出 0,n 這個範圍內沒有出現在陣列中 的那個數字.示例 1 input nums 3,0,1 output 2 示例 2 input nums 0,1 output 2 因為有2個數字,所有數字都在 0,2 之間內.示例 3 input nums 9...