剑指 Offer 56 - I. 数组中数字出现的次数
题目链接:
【分析】如果改成只有一个数字出现一次,其余都出现两次,那么就可以直接异或,最后的结果就是那个出现一次的数字,但是现在是两个出现一次的,这样的话异或的结果就是a^b,其中a和b至少有一位不同,这就意味着最后的结果中必定有一位是1;
接下来我们就可以根据这个1来进行划分,a或b中有一个&这一位的结果为1另一个为0,那么如何找到这个位呢,可以循环&1或者使用lowbit
class Solution {
public int[] singleNumbers(int[] nums) {
int pre = 0;
for(var i: nums) pre ^= i;
int p = 1;
while((p & pre) == 0) p <<= 1;
int[] ans = new int[2];
int a1 = 0, a2 = 0;
for(var i: nums){
if((i & p) == 0) a1 ^= i;
else a2 ^= i;
}
ans[0] = a1; ans[1] = a2;
return ans;
}
}
class Solution {
public int[] singleNumbers(int[] nums) {
int pre = 0;
for(var i: nums) pre ^= i;
int p = pre & -pre;
int[] ans = new int[2];
int a1 = 0, a2 = 0;
for(var i: nums){
if((i & p) == 0) a1 ^= i;
else a2 ^= i;
}
ans[0] = a1; ans[1] = a2;
return ans;
}
}
上一篇:
IDEA上Java项目控制台中文乱码
