当前位置:   article > 正文

只出现一次的数字II ---- 位运算

只出现一次的数字II ---- 位运算

题目链接

题目:

分析:

  • 对于只出现一次的数字, 他的任意一个bit位, 可能是0或1
  • 对于其余出现3次的数字, 假设有3n个数, 那么他们的任意一个bit相加的和可能是3n个0或3n个1
  • 那么对于数组中的全部数字的任意一个bit位之和共有三种情况:
    • 3n个1 + 1 == 3n+1
    • 3n个0 + 1 == 1
    • 3n个1 + 0 == 3n
    • 3n个0 + 0 == 0
  • 此时将得到的结果%3
    • 3n个1 + 1 == 3n+1 %3 = 1
    • 3n个0 + 1 == 1 %3 = 1
    • 3n个1 + 0 == 3n %3 = 0
    • 3n个0 + 0 == 0 %3 = 0
  • 可以观察到得到的结果即这个bit对应的值就是出现一次数字的bit的值
  • 那么我们记录下这个bit位对应的值, 并且遍历全部bit位, 就能知道只出现一次的数字是谁了

代码:

 

  1. class Solution {
  2. public int singleNumber(int[] nums) {
  3. int ret = 0;
  4. for(int i = 0; i < 32; i++){
  5. int sum = 0;
  6. for(int x:nums){
  7. if(((x>>i) & 1) == 1){
  8. sum++;
  9. }
  10. }
  11. sum %= 3;
  12. if(sum == 1) ret |= 1 << i;
  13. }
  14. return ret;
  15. }
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/674563?site
推荐阅读
相关标签
  

闽ICP备14008679号