剑指 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项目控制台中文乱码