给定一个数组,找出其中只出现一次的数字,其余数字都是出现两个以上。(找出单身狗)
方法一:暴力解法;通过计算每个数字出现的次数来找出只出现一次的数字
int arr[] = {1,2,3,4,5,1,2,3,4};//找出单身狗
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
for (i = 0; i < sz; i++)//统计arr[i]出现在数组中的次数
{
int j = 0;
int count = 0;//计数器,计算数字出现了几次
for (j = 0; j < sz; j++)
{
if (arr[i] == arr[j])//判断出现次数
{
count++;// 相等一次加1,正常情况下是2
}
}
if (count == 1)
{
printf("只出现一次的数字是%d\n", arr[i]);
break;
}
}
时间复杂度为O(n²)
方法二:按位运算:异或运算法
异或:^;
的计算规则是转换为二进制数后,两边的对应位不同时,取1,否则取0。如果遇到负数,需要用负数的补码进行计算。
当两个相同的数做异或运算时,他们运算后的结果是0。例如3^3->011^011=000,101^101=0;
当0和一个非零的数进行异或运算时,运算结果是那个非零的数。例如0^3->000^011=011;
本题中,重复的元素都是出现两次,只会有一个元素只出现一次,那么对所有的元素进行异或运算,最后得到的结果就是那个只出现了一次的元素。
int arr[] = { 1, 2, 3, 4, 5, 1, 2, 3, 4 };
int i = 0;
int su = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
su = su ^ arr[i];
}
printf("只出现一次的数字:%d\n",su);
时间复杂度为O(n)

浙公网安备 33010602011771号