一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。
头文件以及主函数(测试):
#include<stdio.h> #include<stdlib.h> int main() { int arr[] = { 4, 6, 4, 5, 5, 3, 6 }; //数组初始化,可自由赋值 int len = sizeof(arr) / sizeof(arr[0]),c; //求数组长度 c = find_f(arr, len); //函数调用 if (c > len) //判断返回值是否合法 printf("这组数中没有单独的数\n"); else printf("%d\n",arr[c]); //合法即输出单独的数 system("pause"); return 0; }
方法一:直接比较法(比较笨),每一个数都和其余的数比较,直到找出单独的
int find_f(int arr[], int len) //寻找单独数 { int i, j, k; for (i = 0; i < len; i++) { k = 0; for (j = 0; j < len; j++) { if ((arr[i] & arr[j]) == arr[i]) //如果两数相同,k++ k++; } if (k == 1) return (i); // 如果(k=1),即本数组中只有自己一个,则返回此数的下标 } return (len + 1); }
方法二:按位异或,设处置为0;0异或任何数都为任何数;
int find_f(int arr[], int len) //寻找单独数 { int temp = 0; for (int i = 0; i < len; i++) { temp = temp^arr[i]; //按位异或 } for (int i = 0; i < len; i++) { if (temp == arr[i]) return i; } return len+1; }
本文只是在下在学习过程自己的想法,只能实现简单功能,可能还没考虑到程序的优化,与大神写出来的代码还有一定差距,如果那位大神发现了问题,请您不吝赐教,如果您还有更好的方法,不妨分享分享,谢谢!