leetcode137. Single Number II

  1. Single Number II
    DescriptionHintsSubmissionsDiscussSolution

DiscussPick One

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;  
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值