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数组的最大长度,再次触发越界错误。
正确解题思路
不需要额外创建数组,利用两个数异或结果的二进制位特征分组即可:
- 首次遍历全数组做异或,得到两个目标数的异或结果xor = x ^ y
- 取出xor二进制中最右侧的1(即
xor & -xor),这个位上x和y的取值一定不同(一个为0、一个为1) - 以这个位为分组标识,二次遍历数组,将该位为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
相关产品推荐
相关产品推荐

