单身狗升级版(只出现⼀次的数字)
根据异或运算的消去律,我们可以将数组中出现次数为偶数的数字消去。
因此,我们可以将数组中所 有数异或起来,得到的结果即为出现次数为奇数的数字异或起来的值。
在得到数组中所有数字的异或结果后,我们还需要根据题意求出两个只出现⼀次的数字的值。可以注 意到,由于这两个数的值必不相同,因此异或数组中的所有值得到的结果⼀定⼤于 0,即两个数⾄少 有⼀位不相同。
//一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
//编写一个函数找出这两个只出现一次的数字。
//例如:
//有数组的元素是:1,2,3,4,5,1,2,3,4,6
//只有5和6只出现1次,要找出5和6.
//#include<stdio.h>
//int main() {
// int arr[] = { 1,2,3,4,5,1,2,3,4,6 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// int i = 0;
// int dog = 0;
// //将原数组全部异或得到由那两个只出现一次数字异或得到的数字
// for (i = 0; i < sz; i++) {
// dog ^= arr[i];
// }
// int count = 0;
// //得到新数字中具体他的二进制位中为 1 的那一位
// for (i = 0; i < 32; i++) {
// if (((dog >> i) & 1) == 1) {
// count = i;
// break;
// }
// }
///*按照不同位首先肯定能把这两个结果元素跟分开对吧
// 分成两组,一组第一位是1,一组第一位是0
// 其他的元素怎么分呢,其实无所谓怎么分,因为最后都会a ^ a为0 抵消掉*/
// int dog1 = 0;
// int dog2 = 0;
// for (i = 0; i < sz; i++) {
// if (((arr[i] >> count) & 1) == 1) {
// dog1 ^= arr[i];
// }
// else {
// dog2 ^= arr[i];
// }
// }
// printf("%d %d\n", dog1, dog2);
// return 0;
//}