Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
要线性的运行复杂度,那一定是有什么奇淫技巧才对,我这么正大光明的人肯定是不会的,所以只好去查找别人的代码,真相是二进制的奇偶校验
一串二进制序列按位异或得到的结果:序列中有偶数个1--->0,序列中有奇数个1--->1.
C语言中的异或运算“^”(int类型)相当于是32个bit分别异或,那么在这道题中将所有数字进行异或运算就相当于是32串二进制序列的按位异或。
举个简单的例子:
如[3, 2, 3]的异或
首先3和2异或
0 1 1
0 1 0
得到 0 0 1,再与3异或
0 0 1
0 1 1
得到0 1 0,即为2
写成行的形式
0 0 0 ---> 0
1 1 1 ---> 1
1 0 1 ---> 0
代码如下:
3ms代码
int singleNumber(int* nums, int numsSize) {
int sum = 0;
for (int i = 0; i < numsSize; sum ^= nums[i], i++) ;
return sum;
}
int singleNumber(int* nums, int numsSize) {
int sum = *nums;
for (int i = 1; i < numsSize; sum ^= nums[i], i++) ;
return sum;
}
6ms代码
int singleNumber(int* nums, int numsSize) {
int sum = nums[0];
for (int i = 1; i < numsSize; sum ^= nums[i], i++) ;
return sum;
}
思考:
为什么sum初始化不同,15个test case就能引起3ms的运行时间差别
知识点:
数组名就是指针,指向该数组的第一个元素的地址