二進(jìn)制32位中的每一位計(jì)算“1”出現(xiàn)的次數(shù)只和,如果能被三整除說(shuō)明只出現(xiàn)一次的那個(gè)數(shù)的二進(jìn)制在該位也為0.如果不能被整除說(shuō)明只出現(xiàn)一次的數(shù)的二進(jìn)制數(shù)在該位是“1”怎静,再采用左移的方式還原該位媚污,最后使用或操作“|”將結(jié)果正確求出舀瓢。
class Solution {
public int singleNumber(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
int res = 0;
int sum = 0;
for (int i = 0; i < 32; i++) {
sum = 0;
for (int num : nums) {
sum += (num >> i) & 1;
}
if (sum % 3 != 0) {
res |= 1 << i;
}
}
System.out.println(res);
return res;
}
}
給定一個(gè)整數(shù)數(shù)組 nums,其中恰好有兩個(gè)元素只出現(xiàn)一次耗美,其余所有元素均出現(xiàn)兩次京髓。 找出只出現(xiàn)一次的那兩個(gè)元素。
有兩個(gè)只出現(xiàn)一次的數(shù)字商架,說(shuō)明至少有一位的異或值為1堰怨,根據(jù)異或值為1的位可以把數(shù)組分為兩部分,分別求這倆個(gè)部分中只出現(xiàn)一次的數(shù)字
class Solution {
public int[] singleNumber(int[] nums) {
int[] res = new int[2];
int length = nums.length;
if(length == 2){
res[0] = nums[0];
res[1] = nums[1];
return res;
}
int bitResult = 0;
for(int i = 0; i < length; ++i){
bitResult ^= nums[i];
}
int index = findFirst1(bitResult);
for(int i = 0; i < length; ++i){
if(isBit1(nums[i], index)){
res[0] ^= nums[i];
}else{
res[1] ^= nums[i];
}
}
return res;
}
private int findFirst1(int bitResult){
int index = 0;
while(((bitResult & 1) == 0) && index < 32){
bitResult >>= 1;
index++;
}
return index;
}
private boolean isBit1(int target, int index){
return ((target >> index) & 1) == 1;
}
}