题1:99个数,里面只有一个数出现了一次,其他均出现了两次;如何最快找到这个数,假设为一个int数组里,数大小没有限制
特点:数值范围不确定;仅有一个数单词出现;
// 运用位操作,异或所有元素;
#include "stdafx.h"
#include <stdlib.h>
#define COUNT 9
void main (void )
{
int numbers[COUNT] = {1, 3, 6, 122, 23, 23, 3, 6, 122}; // 9个随机数
int temp = 0;
for ( int i = 0; i < COUNT; i++)
{
temp ^= numbers[i]; //异或,奇数个自己异或,为自己;
}
printf("find %d\n", temp );
}
只用了9个数运算,偷懒一下下~~
题2:找出数组中只出现一次的两个数
解题方法跟上一题类似,异或后再分组:
1、所有元素整体异或,排除相同值,找到只出现一次的两个数,即a ^ b = c;
2、根据异或特征,不同 则置位 为1;若c 为 00101100 找到最右边的第一个位 1,其他位置0,c 变换为00000100;
3、所有元素与 00000100 进行“&”运算,实现分组;
4、各组再整体异或值,清除相同值,剩下即为 a 或 b的值;
#include "stdafx.h"
#define MAX 10
int main()
{
int ar[MAX] = {2, 34, 10,5, 123,6, 5, 123,2, 34};
int a = 0, b = 0, c = 0, temp = 0;
for (int i = 0; i < MAX; i++)
{
c ^= ar[i] ;//即为a^b
}
//找到最右边的第一个1(不相同的位)
temp = c & (-c);
//按位分组
for (int i = 0; i < MAX; i++)
{
if (ar[i] & temp)
{
a ^= ar[i];
printf("ar1 = %d\n", ar[i]);
}
else
{
b ^= ar[i];
printf("ar0 = %d\n", ar[i]);
}
}
printf("a = %d, b = %d\n", a, b);
return 0;
}