题目要求
Given a non-empty array of integers nums, every element appears twice except for one. Find that single one.
You must implement a solution with a linear runtime complexity and use only constant extra space.
分析
题干说一个非空数组中所有整型元素都是成对出现的,只有一个元素出现了一次,找出这个元素。
另外,题目还要求用复杂度要线性的,这样的话简单的循环嵌套就不行了,因为循环嵌套后复杂度非线性。
查阅资料的时候,发现了一个比较巧妙的方法,在此记录一下。该方法利用了计算机位操作中的异或操作的属性。
0^0=0
1^0=1
1^1=0
0^1=1
- 0异或0为0
- 0异或任何数为它本身
- 1异或任何数为该数取反
- 任何数异或自己为0
a ^ 0 = a
a ^ a = 0
相同为0,不同为1。
此外,异或操作还遵循交换律和结合律。即
a^b^c^a^b
=(a^a)^(b^b)^c
=0^0^c
=c
基于以上规则,此题的思路也就有了。将数组中的所有元素做异或操作,最后的值即为只出现了一次的元素值。
c语言实现
#include <stdio.h>
int singleNumber(int* nums, int numsSize){
int i=0;
int t=0;
for (i=0;i<numsSize;i++){
t = nums[i]^t;
}
return t;
}
int main(){
int arr[9] = {6,5,11,4,3,3,4,5,6};
int t;
t = singleNumber(arr, 9);
printf("%d\n",t);
}