题目分析:[[EVD]] - 剑指 Offer 56 - I. 数组中数字出现的次数
https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/submissions/
简单描述:
- 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
限制🚫
- 2 <= nums.length <= 10000
示例:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
解题思路:
思路:
- #位运算
- 异或运算 a^a=0, 遍历异或后, x^y = m 且 x!=y, 根据其二进制串的不同,作为分组依据,将数组拆分开分别异或 ⚠️:不能想着单纯奇偶分组,因为x、y可能都为奇数或者偶数
- ⚠️ &运算符优先级< ==运算符,需添加括号确保优先 (m&n)==0替代 m&n==0
效率:
- 时间复杂度
- 空间复杂度
代码:
class Solution
{
public:
/*位运算 异或分组*/
vector<int> singleNumbers(vector<int> &nums)
{
int x = 0, y = 0, m = 0, n = 1;
for (int num : nums) // 遍历异或
m ^= num;
while ((m & n) == 0) //找到x^y的首位1
n <<= 1;
for (int num : nums)
{
if (num & n) //拆分为,与x^y首位1相同位置的num二进制为1
x ^= num;
else
y ^= num;
}
return vector<int>{x, y};
}
};