一个数组中,仅有一个数字出现m次,其余数字均出现n次,m不等于n,找出这个出现m次的数字。
n = 2, m = 1
这是通常遇到的情形,利用 x ^ x = 0
及 x ^ 0 = x
可在O(n)
时间内找出仅出现1次的数字
n = 3, m = 1
常见的情形,将这个仅出现1次的数字的二进制每一位求出来,其余出现3次的数字模3均为0。
1 | int FindNumber(int a[], int n) |
n任意,m % n != 0
进一步,若m不等于1,则模n后的结果是该数字在该位上%n。因此要将累加后的结果除以一个倍数。
1 | int f(const vector<int> &v, int n, int m) |
对于m % n = 0
的情况,需要进一步分析是否存在类似的方法。