题1:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
编写一个函数找出这两个只出现一次的数字。
例如:
有数组的元素是:1,2,3,4,5,1,2,3,4,6
只有5和6只出现1次,要找出5和6.
总体思路:将数组所有元素进行异或,得到5和6异或的结果, 将数组分成两组(目的把5和6分开)各组在进行异或,即可得到两个只出现一次的数字(5和6)
第一步:注意到数组元素大多数数字的出现两次,则如果相同的两个数进行异或运算,结果为0;例如 1^1=0 ,2^2=0 ,所以将数组所有元素都异或一遍,得到结果就是数组只出现一次元素异或的结果
解析:因为位操作符满足交换律和结合律
//例如
int arr[]={1,2,3,4,5,1,2,3,4,6};
1^2^3^1^2^3=(1^1)^(2^2)^(3^3)=0