【发布时间】:2019-09-12 21:39:27
【问题描述】:
我有一个关于算法中的位操作的问题。
给定一个整数数组,数组中的每个元素都出现三次,除了一个元素只出现一次。找到只出现一次的元素。
例子:
Input : [1, 2, 4, 3, 3, 2, 2, 3, 1, 1]
Output : 4
我遇到了使用XOR 的解决方案,但我无法理解。以下是解决方案:
int singleNumber(vector<int> A) {
int first = 0;
int second = 0;
for(auto n:A){
first = (first ^ n) & ~second;
second = (second ^ n) & ~first;
}
return first;
}
有人能解释一下下面两行代码的工作原理吗?
first = (first ^ n) & ~second;
second = (second ^ n) & ~first;
[已编辑]
我为循环中的每次迭代都包含了cout<<first<<" "<<second<<endl;,但它显示了我无法理解的以下输出。这如何导致解决方案?
1 0
3 0
7 0
4 3
4 0
6 0
4 2
5 0
4 1
4 0
【问题讨论】:
-
执行过程中的什么时候你会感到困惑?显示您打印的痕迹,或您所做的桌面检查;解释你在哪里卡住了。
-
@Prune 嗨,我已经编辑了我的问题,现在请回答。
-
我会等待我请求的跟踪和解释。
-
@Prune 我没有被困在执行中。我被困在唯一的解释中,为什么这段代码有效?那么,我应该如何回答解释部分?
-
查看所有循环中的值,以及每个操作的结果。向我们解释您不遵循顺序的地方。也许通过一些代数来推导出
first和second的新值作为n的函数。通过一个 8 行的真值表来查看每种输入组合会发生什么。