首页 新闻 会员 周边 捐助

C语言 | 找出这两个只出现一次的元素

0
[待解决问题]

给定一个非空的整数数组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;
}
卡特SKY的主页 卡特SKY | 菜鸟二级 | 园豆:204
提问于:2024-11-01 19:44
< >
分享
所有回答(1)
0

在C语言中,要求找出一个数组中两个只出现一次的元素,其余元素都出现两次,你可以通过位运算的方式来高效地完成这一任务。下面是一种常用的方法,利用异或(XOR)的特性,最终找到两个唯一的数字。

思路:

  1. 异或运算的性质

    • a ^ a = 0(任何数与自己异或的结果为0)
    • a ^ 0 = a(任何数与0异或的结果为该数本身)
    • 异或运算是可交换和结合的。
  2. 步骤详细说明

    • 首先,遍历数组,对所有元素进行异或操作,这样最终得到的结果就是那两个只出现一次的元素的异或值。
    • 通过这个异或结果,我们可以找到这两个数中任意一个不为0的位(也是说这两个数在这个位上不同),用来将数组分成两个部分。
    • 分别对这两个部分进行异或操作,可以找到这两个唯一的数。

实现代码:

#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;
}

代码说明:

  1. 第一遍:通过循环计算所有元素的异或,得到两个只出现一次的数字的异或结果(xor_result)。
  2. 计算不同的位:使用 xor_result & -xor_result 提取最低位的1,确保找到的位是不同的。
  3. 第二遍:重新遍历数组,将元素根据该位的值分成两组,然后分别对每组进行异或操作,找到这两个出现一次的元素,分别赋值给 element_aelement_b
  4. 输出结果:最后打印出两个只出现一次的元素。

复杂度:

  • 时间复杂度:O(n),只需两次遍历。
  • 空间复杂度:O(1),只使用了有限的额外变量。

这种方法高效且简单,能够快速找到两个只出现过一次的元素。

Technologyforgood | 园豆:7775 (大侠五级) | 2024-12-03 16:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册