LeetCode.260.只出现一次的数III(灵活应用位运算)
思路:数组中仅有两个元素出现一次,其余元素均出现两次,也就是说所有元素异或的结果就等于这两个元素异或的结果,异或某一位结果为1说明在这一位这两个数字的位不同(一个为1,另一个为0),因此我们可以选择该不同的位作为划分,以这两个数字的不同位为基准,将数组中该位为1的划分到其中一个组中,为零的划分到另一个组中,然后异或两个组得到最终答案,这样就保证了两个不同的数字在两个组中,其余相同的数字也在相同的组中。
参考代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public int[] singleNumber(int[] nums) { 2 int modNum = 0; 3 int ans[] = new int[2]; 4 for(int num : nums) { 5 modNum ^= num; 6 } 7 int h = modNum & (-modNum); 8 for(int num : nums) { 9 if((num & h) == 0) { 10 ans[0] ^= num; 11 } else { 12 ans[1] ^= num; 13 } 14 } 15 return ans; 16 }
时间并不会因为你的迷茫和迟疑而停留,就在你看这篇文章的同时,不知道有多少人在冥思苦想,在为算法废寝忘食,不知道有多少人在狂热地拍着代码,不知道又有多少提交一遍又一遍地刷新着OJ的status页面……
没有谁生来就是神牛,而千里之行,始于足下!