LeetCode Single Number II

本文介绍了一种解决LeetCode上的单数III问题的方法,该方法不使用额外内存空间,而是通过位操作来找出数组中仅出现一次的整数。文章详细解释了如何遍历每个二进制位并计算所有数在该位上出现次数的和,最终通过求模运算找到目标数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接在这里:https://leetcode.com/problems/single-number-ii/

这道题的关键就是要求no extra memory space. 所以就用到了bit manipulation.

思路就是维护一个32位的数组,因为int 都是32位的,外层loop是对应每一位,内层loop是算所有的数在这一位上出现次数的和。

Mod 3 后剩下的就是那个只出现了一次的数。

Note: 1. Check if current bit is 1 using:

nums[j] >> i & 1
但要注意的是bit operator >> & 都比 == operator 运算级别低,所以要加括号。

2.  给了一个array代表2进制的数,转化成10进制的数就是用

res += bitCounter[i]<<i


AC Code:

public class Solution {
    public int singleNumber(int[] nums) {
        if(nums == null || nums.length == 0){
            return Integer.MIN_VALUE;
        }
        
        int res = 0;
        int [] bitCounter = new int[32];
        for(int i = 0; i < 32 ; i++){
            for(int j = 0 ; j < nums.length; j++){
                if((nums[j]>>i&1) == 1){ //error
                    bitCounter[i]= (bitCounter[i] + 1)%3;
                }
            }
        }
        for(int i = 0; i < 32; i++){
            res  += bitCounter[i]<<i;
        }
        
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值