给定一个非空的整数数组nums,已知有两个元素只出现了一次,其余元素均出现两次,那么请你找出这两个只出现一次的元素。
#include <stdio.h>
void print_two_once_element(int nums[], int n)
{
int element_a, element_b;
//...
//printf("%d, %d\n", element_a, element_b);
}
int main(void)
{
int nums[6] = { 1, 1, 2, 3, 3, 4 };
print_two_once_element(nums, 6);
return 0;
}
在C语言中,要求找出一个数组中两个只出现一次的元素,其余元素都出现两次,你可以通过位运算的方式来高效地完成这一任务。下面是一种常用的方法,利用异或(XOR)的特性,最终找到两个唯一的数字。
异或运算的性质:
步骤详细说明:
#include <stdio.h>
void print_two_once_element(int nums[], int n)
{
int xor_result = 0;
// 第一次遍历:计算所有数的异或
for (int i = 0; i < n; i++) {
xor_result ^= nums[i];
}
// 找到x为xor_result中任意一个不为0的位
int diff_bit = xor_result & -xor_result; // 提取最低位的1
int element_a = 0, element_b = 0;
// 第二次遍历:根据diff_bit将数分成两组
for (int i = 0; i < n; i++) {
if (nums[i] & diff_bit) {
element_a ^= nums[i]; // 第一组
} else {
element_b ^= nums[i]; // 第二组
}
}
printf("%d, %d\n", element_a, element_b);
}
int main(void)
{
int nums[6] = { 1, 1, 2, 3, 3, 4 };
print_two_once_element(nums, 6);
return 0;
}
xor_result
)。xor_result & -xor_result
提取最低位的1,确保找到的位是不同的。element_a
和 element_b
。这种方法高效且简单,能够快速找到两个只出现过一次的元素。