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;  
    }
}
 
原文地址:https://www.cnblogs.com/zhangmingzhao/p/7277217.html