zoukankan      html  css  js  c++  java
  • 剑指Offer56.II 数组中数字出现的次数II(位运算的性质)

    原题链接

    思路:本题最容易想的思路就是哈希表,第二种思路是使用位运算,由于只有一个数只出现了一次,其余数字都出现了三次,那么也就是说除去这个出现一次的数字以外,剩余的数字之和可以被三整除,同时,这些数字在二进制某一位上为1的个数也应该是三的倍数,如果某一位上 1的个数不是3的倍数说明那个只出现一次的数在那一位是1,所以问题就简单起来了。我下面是逐个统计每一位为1的和,然后直接计算答案,等到所有数字都为0之后直接结束算法。

    参考代码

     1 public static int singleNumber(int[] nums) {
     2         
     3         int num; // 标志每一位上1的个数
     4         int temp = 0; // 标志目前是第几位,从零算起
     5         int ans = 0; // 最终答案,迭代计算
     6         int len = nums.length;
     7         boolean flag = true; // 当所有数字都为零时退出循环
     8         while(flag){
     9             num = 0;
    10             flag = false;
    11             for(int j = 0; j < len; j ++) {
    12                 if(nums[j] > 0) flag = true;
    13                 if(nums[j] % 2 == 1) {
    14                     num ++;
    15                 }
    16                 nums[j] >>= 1;
    17             }
    18             if(num % 3 != 0) {
    19                 ans += Math.pow(2, temp);
    20             }
    21             temp ++;
    22         }
    23         return ans;
    24     }
    View Code
  • 相关阅读:
    ubuntu下开发环境的搭建
    用移动存储设备安装Ubuntu全攻略
    LAMP服务器搭建
    PHP关闭提示、打印配置
    PHPmyadmin修改root密码
    转 sql2oracle
    SQL Server链接其他数据库服务器的方法(转)
    转(哈希查找)
    日语网址
    Reflector 右键注册
  • 原文地址:https://www.cnblogs.com/bianjunting/p/14284358.html
Copyright © 2011-2022 走看看