思路:
一:题目一开始就规定了这个数组的标准——只有一个数字出现一次,其他数字都是成对出现的,因此,重点就是如何排除成对的数,和保留单独的数
二:^的特点:相同为0,不同为1,与本题“成对为相同”和“单独为不同”类似。
三:a^a=0,0^a=a这两个公式是按位异或^的重要公式,于是我们可以让数组的数每一个都按位异或,最后成对的都变为0,只剩下一堆0和单独的数,0^单独的数=单独的数,就能找到答案了。
例如题目中的数组:1 2 3 4 5 1 2 3 4 ==> 1^2^3^4^5^1^2^3^4 ==>
(1^1)^(2^2)^(3^3)^(4^4)^5 ==> 0^0^0^0^5 ==> 0^5=5
答案:
#include<stdio.h>
int one(int* arr, int sz) //定义一个返回值位只有一个数的函数
{
int ret = 0, i = 0;
for (i = 0; i < sz; i++) //从数组第一个到最后一个
{
ret = ret ^ *(arr + i); //一直按位异或,最后得到的数便是只有一个的数(因为a^a=0,0^a=a,所以成对的数都会变为0,最后0就会和只有一个的数^上,就是答案)
}
return ret; //返回只有一个的值
}
int main()
{
int arr[9] = { 1,2,3,4,5,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]); //sz代表数组中元素的个数
int ret = one(arr, sz);
printf("只有一个的数字是:%d\n", ret);
return 0;
}
另:数组名arr除了在sizeof(arr)和&arr中arr表示整个数组,其余都表示数组的首元素地址,所以函数传参时,要用接受地址的指针变量,即int*arr
arr为整型数组的首元素地址,所以它的大小为一个整型,即4个字节,因此arr+1也就是数组中下一个元素的地址。