【发布时间】:2017-05-21 19:10:02
【问题描述】:
这是我刚刚看到的一个 leetcode 问题。有人给出的解决方案有点难以理解,我希望有人能详细说明一下:
给定一个整数数组,每个元素都会出现 3 次,但只有一个元素只出现一次。找到那个。
在没有额外空间的线性时间内执行此操作。
有人给出的解决方案:
public int singleNumber(int[] A) {
int ones = 0, twos = 0;
for(int i = 0; i < A.length; i++){
ones = (ones ^ A[i]) & ~twos;
twos = (twos ^ A[i]) & ~ones;
}
return ones;
}
这似乎是一个很棒的解决方案,但有点难以理解。 cmets 中有人说这可以扩展到任意数量的重复。
【问题讨论】:
-
如果每个元素出现两次,除了一个,那么你可以对所有数字进行异或。我想这是适应了 3 次。
-
使用数组
[n, n, n],可以看到变量取值n, 0、0, n和0, 0。现在只需表明数组的顺序无关紧要。
标签: algorithm