一组数字中,有两个数字出现一次,剩下数字出现两次,求这两个数

来源:互联网 发布:windows桌面壁纸 编辑:程序博客网 时间:2024/06/01 09:00

两个数不相同,则说明这两个数字的异或结果肯定不为0

把两个数异或结果从低位到高位第一次不同的位置1,其他位置0,就有一个000...01000...的结果

如果数组中有数字 & 这个数为0,则说明这个数有可能为单独出现的数字中的一个

相反如果不为0,则说明有可能是另一个单独出现的数字

然后把两组分出来的结果分别异或就得到了俩个不同的数字。

#include<stdio.h>#include<windows.h>void FindNumOnce(int src[],int len, int *x, int *y){int i = 0;int flag = 0;for (i = 0; i < len; i++){flag ^= src[i];                  //flag的结果就是两个不同数异或的结果}flag &= (flag ^ (flag - 1));         //把两个数异或结果从低位到高位第一次不同的位置1for (i = 0; i < len; i++){if ((src[i] & flag) == 0)        //分离出为0的一组{*x ^= src[i];}else                             //分离出不为0的一组{*y ^= src[i];}}}int main(){int arr[] = { 1, 2, 3, 4, 124563, 1234, 4, 3, 2, 1 };int num1 = 0;int num2 = 0;FindNumOnce(arr,sizeof(arr)/sizeof(arr[0]), &num1, &num2);printf("num = %d,num2 = %d\n", num1, num2);system("pause");return 0;}

0 0
原创粉丝点击