找出只出现的一次的数c语言实现及优化:
`例题:
使用for循环实现代码:
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
//int count = 0;
for (int i = 0; i < sz; i++)
{
int count = 0;
for (int j = 0; j < sz; j++)
{
//count = 0;
if (arr[i] == arr[j])
{
count++;
}
}
if (count == 1)
{
printf("唯一的数为:%d", arr[i]);
break;
}
}
return 0;
}
反思与优化:
我们会发现使用for循环很容易想出与解答但同时也会发现会存在复杂度较大的情况,考虑如何减少复杂度呢。这里我们引出一个运算符–按位异或。
按位异或
按位异或运算符 (^) 将其第一操作数的每个位与其第二操作数的相应位进行比较。 如果其中一个操作数中的位为 0,而另一个操作数中的位为 1,则相应的结果位设置为 1。 否则,将对应的结果位设置为 0。
eg:同时按位异或满足交换律。
优化成果与总结:
int main()
{
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = 0;
for (int i = 0; i < sz; i++)
{
ret = ret ^ arr[i];
}
printf("唯一的一个值为:%d", ret);
return 0;
}
我们会发现这样复杂度就大大降低了,希望对大家有所帮助。