// 乙個整型陣列裡除了2個數字分別出現1次之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。
// 要求時間複雜度是o(n),空間複雜度是o(1)。
//如果我們能把問題中的陣列分成2個子陣列,使得每個子陣列中都只有乙個唯一的元素以及很多成對的元素,那麼我們就可以求出每個子陣列中唯一的元素,最終就可以得到原陣列中2個出現次數唯一的元素。方法是這樣的:1. 首先陣列中所有元素依次異或,因為相同的元素異或得到0,所以最終的答案就等於那2個唯一的元素a^b的值。2. 因為a,b不同,所以異或得到的答案肯定是不等於0的,那麼我們就找到a^b的二進位制表示中第乙個為1的位,假如是第k位。而a,b兩個數在第k位上是不同的,乙個為0,乙個為13. 接下來我們將第k位是1的分成一組,第k位是0的分成一組,如果2個元素相同,那麼他們第k位肯定是一樣的,所以肯定被分到同一組中。而a,b則被分到2組中去了。然後我們就可以在每個分組中異或每乙個元素,最終就可以得到那2個唯一的元素。
void findtwo(int a,int len)
}//第j位為1,說明這兩個數字在第j位上是不相同的,由此分組即可
for(i=0;i> j) & 1) == 0)
else
}printf("%d - %d\n",n1,n2);
}
陣列中只出現一次的兩個數字
乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。你可以假設這兩個數字一定存在。樣例輸入 1,2,3,3,4,4 輸出 1,2 解決方案 異或 兩個相同的元素異或 設出現一次的數字分別為x和y 1,先用乙個sum 將整個陣列遍歷一遍同時異或該陣列元素與sum...
陣列中只出現一次的兩個數字
我們知道如果出現一次的數只有1個,其餘的都出現了兩次,那麼,直接異或一遍就可以了,但是,此題有2個 所以,異或一遍的結果為x y,即出現一次的兩個數異或的結果,從s x y 0,知道s的某位為1,x與y的在s為1的位不一樣,這樣就可以將數分為兩個集合,與s相同位為1的和s相同位為0的,x與y一定在兩...
陣列中只出現1次的兩個數字 面試題
這個題如果換成陣列中只出現一次的乙個數字,就非常好做了,大家都知道這個題目如何做,其實陣列中出現一次的數字有兩個也可以使用異或的方式來處理,不過不能直接進行判斷,需要分成兩組,每一組含有乙個只出現一次的數字,現在問題來了?應該如何把這兩數字進行分開,而且每乙個陣列都要含有除了只出現一次數字其他數必須...