陣列中只出現一次的兩個數字。
乙個整型陣列裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度o(n),空間複雜度o(1)。
例如,輸入陣列,因為只有4和6只出現了一次,其他數字出現了兩次,所以輸出4和6。
先考慮這樣乙個問題,如果這個陣列中,只有乙個陣列出現1次,其餘數字都出現了2次,怎麼找到這個出現了1次的數字呢?這時候,可以想到異或運算的乙個性質:任何乙個數字異或自己都等於0。也就是從頭到尾異或一遍的結果,就是只出現1次的數字了,因為出現兩次的數字都變成0了。
再回到原來的問題上,如果嘗試將原陣列分成兩部分,將出現1次的兩個數字分到兩部分中,就可以使用上面的方法把出現1次的這兩個數找出來了。此時,將陣列裡的數字依次異或,這個操作的效果等價於將只出現1次的兩個數字做異或。這個結果值一定不為0,那麼,這個數的二進位制形式,一定至少存在乙個1,在結果值的二進位制中找到右數的第乙個1。那麼就根據這個特點,將原陣列劃分成兩部分。那些成對出現的數字一定被劃分到了一組中,出現1次的兩個數字也可以被劃分到兩個部分。
package com.wsy;
public class main ;
int first = 0, sum = 0, length = array.length;
for (int i = 0; i < length; i++)
int right = sum & (~sum + 1);// 找出最右邊的1
for (int i = 0; i < length; i++)
}system.out.println("出現一次的數字是:" + first + "," + (sum ^ first));
}}
陣列中唯一只出現一次的數字。
在乙個陣列中除乙個數字之外,其他數字都出現了三次。請找出那個只出現了一次的數字。
上面的異或思路,在這裡不能用了,於是換乙個思路。如果乙個數字出現了3次,那麼它的二進位制表示的每一位也出現了3次,將所有出現3次的數字的二進位制表示的每一位加起來,每一位的和都可以被3整除。
於是,我們將陣列中的數字都用二進位制表示出來,將它們按位相加,如果某一位的和能被3整除,那麼只出現1次的這個數的二進位制表示中,這一位是0,否則,這一位是1。那麼就得到了這個只出現1次數字的二進位制表示,也就得到了這個只出現一次的值。
package com.wsy;
public class main ;
int bits = new int[32];
int length = array.length;
for (int i = 0; i < length; i++)
}int result = 0;
for (int i = 0; i < 32; i++)
system.out.println("出現一次的數字是:" + result);
}}
面試題56 陣列中數字出現的次數
題目一 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。異或的基本性質 2個相同的數異或等於0,且異或操作 滿足結合律和交換律。首先 乙個整型陣列裡除了1個數字之外,其他的數字都出現了兩次。請寫程式找出這個只出現一次的數字。找出陣列中只出現一次的數 num...
面試題56 陣列中數字出現的次數
面試題56 陣列中數字出現的次數 public class int results int resultnum 0 for int i 0 i length i int indexofdigit1 findindexofdigit1 resultnum for int j 0 j length j ...
面試題56 I 陣列中數字出現的次數
面試題56 i.陣列中數字出現的次數 難度中等92收藏分享切換為英文關注反饋 乙個整型陣列nums裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o n 空間複雜度是o 1 示例 1 輸入 nums 4,1,4,6 輸出 1,6 或 6,1 示例 2 輸入...