C语言实现找出替换的数字:时间复杂度O(N),空间复杂度O(1)

题目描述:

有N个不同的数,分别是1到N,在随机打乱顺序的过程中,出现了一点小误差,其中一个数换成了另一个数。请你找出谁替换了谁,要求时间复杂度是O(N),辅助空间O(1),这意味不能使用数组、map、set、vector等。

输入:

N个数ai(1<=ai<=N),其中缺了一个,而又有一个数出现了2次,其它都出现了1次,数之间有一个空格。(N<2000)

输出:

两个整数a和b(a是缺的哪一个,b是出现两次的那一个),中间有一个空格,没有回车

输入样例:

2 3 4 1 3 6

输出样例:

5 3

代码:

#include <stdio.h>
int a[2005], b[2005];
int main()
{
    int n, i, j, x1, x2, y1, y2;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        b[a[i]]++;
    }
    for (i = 1; i <= n; i++)
    {
        if (b[i] == 0)
            x1 = i;
        if (b[i] == 2)
            x2 = i;
    }
    for (i = 1; i <= n; i++)
    {
        if (a[i] == x1)
            y1 = i;
        if (a[i] == x2)
            y2 = i;
    }
    printf("%d %d", x1, x2);
    return 0;
}

代码解释:

  1. 数组初始化: 声明两个数组 aba 数组用于存储输入的数字,b 数组用于记录每个数字出现的次数。
  2. 输入数据: 使用 scanf 函数读取输入的数字并存储到 a 数组中,同时更新 b 数组中对应数字的计数。
  3. 查找缺失数字和重复数字: 遍历 b 数组,找到计数为 0 的数字(缺失数字)和计数为 2 的数字(重复数字),分别存储到 x1x2 中。
  4. 查找替换位置: 遍历 a 数组,找到值为 x1x2 的数字,分别存储到 y1y2 中。
  5. 输出结果: 输出 x1x2,即缺失的数字和重复出现的数字。

总结:

该代码利用两个数组,分别记录输入数字和每个数字出现的次数,通过两次遍历找到缺失的数字和重复出现的数字,时间复杂度为 O(N),空间复杂度为 O(1)。

注意: 该代码假设输入数据满足题目描述,即只有一个数字缺失,只有一个数字出现两次,并且所有数字都在 1 到 N 之间。

C语言实现找出替换的数字:时间复杂度O(N),空间复杂度O(1)

原文地址: https://www.cveoy.top/t/topic/ntIK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录