当前位置: 面试刷题>> 不重复的两个数 (经典算法题500道)


### 题目描述补充 题目:在一个整数数组中,除了两个数字之外,其他数字都出现了两次。请找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度尽量低。 ### 示例 给定数组 `[1, 2, 3, 2, 3, 4, 5]`,输出应为 `[1, 4, 5]` 中的任意两个数(因为 4 和 5 是只出现一次的数字,但题目只要求找出两个即可,不特定顺序)。但为简化问题,我们常约定以某种方式(如异或结果的性质)区分并返回这两个数。 ### 解题思路 利用异或(XOR)运算的性质:任何数和0做异或运算,结果仍然是原来的数;任何数和其自身做异或运算,结果是0;异或运算满足交换律和结合律。 1. **首先**,将所有数字进行异或运算,得到的结果是两个只出现一次的数字的异或结果。 2. **然后**,找到异或结果中任意一个为1的位,这个位在两个只出现一次的数字中必为一个为0,一个为1。 3. **接下来**,根据这个位将数组分为两组,一组是该位为0的所有数字,另一组是该位为1的所有数字。 4. **最后**,分别对两组中的所有数字进行异或运算,得到的结果就是两个只出现一次的数字。 ### PHP 代码示例 ```php function findTwoUniqueNumbers($nums) { $xor = 0; foreach ($nums as $num) { $xor ^= $num; } // 找到xor中任意一个为1的位 $bit = 1; while (($bit & $xor) == 0) { $bit <<= 1; } $a = $b = 0; foreach ($nums as $num) { if (($num & $bit) != 0) { $a ^= $num; } else { $b ^= $num; } } return [$a, $b]; } // 示例 $nums = [1, 2, 3, 2, 3, 4, 5]; $result = findTwoUniqueNumbers($nums); print_r($result); ``` ### Python 代码示例 ```python def find_two_unique_numbers(nums): xor = 0 for num in nums: xor ^= num # 找到xor中任意一个为1的位 bit = 1 while (bit & xor) == 0: bit <<= 1 a, b = 0, 0 for num in nums: if num & bit: a ^= num else: b ^= num return [a, b] # 示例 nums = [1, 2, 3, 2, 3, 4, 5] result = find_two_unique_numbers(nums) print(result) ``` ### JavaScript 代码示例 ```javascript function findTwoUniqueNumbers(nums) { let xor = 0; for (let num of nums) { xor ^= num; } // 找到xor中任意一个为1的位 let bit = 1; while ((bit & xor) === 0) { bit <<= 1; } let a = 0, b = 0; for (let num of nums) { if (num & bit) { a ^= num; } else { b ^= num; } } return [a, b]; } // 示例 const nums = [1, 2, 3, 2, 3, 4, 5]; const result = findTwoUniqueNumbers(nums); console.log(result); ``` 在这些示例中,我们使用了异或运算和位运算来找到只出现一次的两个数字,满足了题目要求的时间复杂度和空间复杂度。