137. Single Number II
上个题的升级版,现在是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; } }