• 137. Single Number II


    137. Single Number II

    Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.

    Note:
    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

    上个题的升级版,现在是3个相同的中找出那个例外。上一种方法不适用了。

    但是思想还是位操作,二进制思想。

      假设输入中没有single number,那么输入中的每个数字都重复出现了数字,也就是说,对这32位中的每一位i而言,所有的输入加起来之后,第i位一定是3的倍数。
      现在增加了single number,那么对这32位中的每一位做相同的处理,也就是说,逐位把所有的输入加起来,并且看看第i位的和除以3的余数,这个余数就是single numer在第i位的取值。这样就得到了single number在第i位的取值。这等价于一个模拟的二进制,接着只需要把这个模拟的二进制转化为十进制输出即可。
      为了完成上面的过程,需要使用一个数组 int a[ 32 ]来模拟位运算。

      另外,这个做法可以扩展,如果有一堆输入,其中1个数字出现了1次,剩下的数字出现了K次,这样的问题全部可以使用这样的办法来做。

      

      加深了使用位运算的习惯。

      

      

    public class Solution {
       public static int singleNumber(int[] nums) {  
            int[] bin = new int[32];
            bin[0] = 0;
            int n = nums.length;
            int result=0;  ?//最后的结果
            for(int i=0;i<32;i++){  //第i尾
                for(int j=0;j<n;j++){  
                    bin[i] += ( (nums[j]>>i) &1 ); //  只与1与当前位做与运算,得出的结果是改数当前位的值
                    bin[i]=bin[i]%3; //然后求它们除以3的余数。  
                }  
                result |= (bin[i]<<i);//当前第i位还原到10进制,亦或|只要当前位有值1,就存过来。注意x|a和x&1的巧妙用法
            }  
            return result;  
        }
    }
     
  • 相关阅读:
    CSS常用记录
    CSS字体图标使用方式
    CSS之多个div一行排列
    Mysql MVCC原理和幻读解决
    第8章 管理还原数据
    第20章 数据的移动
    oracle恢复删除的数据
    第11章 索引的管理与维护
    第10章 管理表
    第19章 归档模式下的数据库恢复
  • 原文地址:https://www.cnblogs.com/zhangmingzhao/p/7277217.html
Copyright © 2020-2023  润新知