一个数组中只有两个数字是出现一次的,其他的数字都出现了两次,找出这两个数字,编写程序。
程序员文章站
2022-03-10 09:52:30
...
本题的最关键之处就是巧用两个数异或得到的二进制中“1”单位位数
代码如下:
方法一:
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 1, 2, 3, 4, 5, 6 };
int i = 0;
int ret = 0;
int pos = 0;
int num1 = 0;
int num2 = 0;
//1.把所有数字异或
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
ret ^= arr[i];
}
//2.找ret二进制中为1的数
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1) == 1)
{
pos = i;
break;
}
}
//分组
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
num1 ^= arr[i];
}
}
num2 = num1^ret;
printf("num1=%d,num2=%d\n", num1, num2);
return 0;
}
方法二:
#include<stdio.h>
void find_two_diff_num(int arr[], int sz, int *p1, int *p2)
{
int i = 0;//循环变量
int ret = 0;
int pos = 0;
*p1 = 0;//数字1的地址
*p2 = 0;//数字2 的地址
//1.把所有数字异或
for (i = 0; i < sz; i++)
{
ret ^= arr[i];//循环到最后一次的结果是5^6,即就是101^110=011
}
//2.找ret二进制中为1的一位
for (i = 0; i < 32; i++)
{
if (((ret >> i) & 1) == 1)//上一步两个数异或的后两位为1
{
pos = i;
break;
}
}
//分组
for (i = 0; i < sz; i++)
{
if (((arr[i] >> pos) & 1) == 1)
{
(* p1) ^= arr[i];
}
}
(*p2) = (*p1) ^ ret;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 1, 2, 3, 4, 5, 6 };
int sz = sizeof(arr) / sizeof(arr[0]);//数组大小
int num1 = 0;//数字1
int num2 = 0;//数字2
find_two_diff_num(arr, sz, &num1, &num2);
printf("num1=%d,num2=%d\n", num1, num2);
return 0;
}
运行结果:
推荐阅读
-
刷题总结:1.找出数组中只出现一次的数字,其它数字都出现了两次
-
只出现一次的数字III(给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。)
-
C语言编程实现之一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数字
-
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次, 找出这两个只出现一次的数字。
-
一个数组中只有两个数字是出现一次的,其他的数字都出现了两次,找出这两个数字,编写程序。
-
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
-
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
-
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。...
-
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
-
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。