You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GFG Non Repeating Numbers题位运算解法过基例后卡住排查

代码无法运行的核心原因

你的代码存在语法误用和逻辑错误两类问题,运行非基础用例时会触发数组下标越界异常,表现为程序卡住/崩溃:

  • 增强for循环语法使用完全错误:Java增强for循环的循环变量直接取数组元素值,不是数组下标。你代码中for(int i1:nums)循环里写c=c^nums[i1]、for(int i2:b)循环里写c1=c1^b[i2],都是把元素值当下标访问数组,当元素值大于等于数组长度时会直接抛出数组下标越界错误。
  • 位运算解题逻辑从根源出错:第一次遍历全数组异或得到的结果c,是两个不重复数的异或值(所有成对元素异或抵消为0,最终结果为x^y,x、y是两个目标数),这个值本身不属于原数组元素,你误以为它是第一个唯一数的判断完全不成立。
  • 新数组构造逻辑失效:你创建的新数组b长度为原数组长度减1,判断逻辑是遇到值等于c就跳过写入,但c不是原数组元素,这个判断永远不会触发,最终写入元素时索引k会超出b数组的最大长度,再次触发越界错误。
正确解题思路

不需要额外创建数组,利用两个数异或结果的二进制位特征分组即可:

  1. 首次遍历全数组做异或,得到两个目标数的异或结果xor = x ^ y
  2. 取出xor二进制中最右侧的1(即xor & -xor),这个位上x和y的取值一定不同(一个为0、一个为1)
  3. 以这个位为分组标识,二次遍历数组,将该位为1的元素归为一组做异或、该位为0的元素归为另一组做异或,两组最终的异或结果就是两个目标数
修正后可运行代码
class Solution
{
    public int[] singleNumber(int[] nums)
    {
        int[] res = new int[2];
        int xor = 0;
        // 先得到两个唯一数的异或结果
        for(int num : nums){
            xor ^= num;
        }
        // 取最右侧的1作为分组位
        int rightBit = xor & -xor;
        int x = 0, y = 0;
        for(int num : nums){
            // 按分组位拆分异或
            if((num & rightBit) != 0){
                x ^= num;
            }else{
                y ^= num;
            }
        }
        res[0] = x;
        res[1] = y;
        return res;
    }
}

内容的提问来源于stack exchange,提问作者Lostmymind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:36:15