当向量中的所有其他数字恰好出现三次时,我无法找到仅出现一次的数字。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ones = 0;
int twos = 0;
for(const int& n : nums)
{
ones = (ones ^ n) & ~twos;
twos = (twos ^ n) & ~ones;
std::cout << ones << "\t" << twos << "\n";
}
return ones;
}
};
对于输入 2,2,5,5,9,2,5 而言ones
and twos
在不同的过程中获取这些值
Ones Twos
2 0
0 2
5 2
0 7
8 6
8 4
9 0
我的问题是我怎么知道该算法会起作用,因为异或和补码会产生如下值0 7
, 8 4
and 8 6
在两次传递之间,这些传递甚至不在正在解析的整数值中。
我不明白这里的定理是什么,它确保所有这些中间值最终都会减少到仅在输入向量中出现一个的值。我如何完全确定所有这些中间结果都会被清除并最终成为我想要检测的值。
谁能解释一下吗?
我只是明白ones = (ones ^ n) & ~twos;
意味着添加到ones
如果它不存在于twos
and twos = (twos ^ n) & ~ones;
意味着添加到twos
如果它不存在于ones
。这就是我所理解的。我不明白中间不相关的值背后的逻辑,让位于结果值。