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
  • 相关阅读:
    HTML 常见标签part1
    HTML 初始
    jenkins远程执行脚本不退出
    jenkins 持续集成工具安装
    jenkins 杀掉衍生进程解决办法
    日志分割工具-crononlog
    可视化库 pygal 生成png中文乱码
    可视化库 pygal 无法保存成本地文件
    一个很好用的ORM库--peewee
    3 种进度条 -- 记录
  • 原文地址:https://www.cnblogs.com/bianjunting/p/14284358.html
Copyright © 2011-2022 走看看