137. Single Number II(位运算)

题目链接:https://leetcode.com/problems/single-number-ii/

Given a non-empty 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?

Example 1:

Input: [2,2,3,2]
Output: 3

Example 2:

Input: [0,1,0,1,0,1,99]
Output: 99

思路:

位运算。

一种具有普适性的这类题的解法:

基本思路是一个int数字有32位,对于二进制32位中的每一位计算“1”出现的次数只和,

如果能被三整除说明只出现一次的那个数的二进制在该位也为0.如果不能被整除说明只出现

一次的数的二进制数在该位是“1”,再采用左移的方式还原该位,最后使用或操作“|”将结果正确求出。

比如数组 2 3 2 2 4 4 4

竖着转换为二进制(我这里先用8位演示,32位同理):

2:  0  0  1  0

3:  0  0  1  1

2:  0  0  1  0

2:  0  0  1  0

4:  0  1  0  0

4:  0  1  0  0

4:  0  1  0  0

从右往左看竖着的每一位,当取出竖着的每一位的总和时,能被3整除的那位就置零,否则置一。

AC 1ms Java:

class Solution {
    public int singleNumber(int[] nums) {
        if(nums==null||nums.length==0)
            return -1;
        int ans=0;
        for(int i=0;i<32;i++){
            int bitSum=0;
            for(int num:nums){
                int bit=(num>>i)&1;//取出第i位的值。
                bitSum=bitSum+bit;
            }
            if(bitSum%3!=0)
                ans=ans|(1<<i);//将第i位置1
        }
        return ans;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值