C语言实现找出替换的数字:时间复杂度O(N),空间复杂度O(1)
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;
}
代码解释:
- 数组初始化: 声明两个数组
a和b,a数组用于存储输入的数字,b数组用于记录每个数字出现的次数。 - 输入数据: 使用
scanf函数读取输入的数字并存储到a数组中,同时更新b数组中对应数字的计数。 - 查找缺失数字和重复数字: 遍历
b数组,找到计数为 0 的数字(缺失数字)和计数为 2 的数字(重复数字),分别存储到x1和x2中。 - 查找替换位置: 遍历
a数组,找到值为x1和x2的数字,分别存储到y1和y2中。 - 输出结果: 输出
x1和x2,即缺失的数字和重复出现的数字。
总结:
该代码利用两个数组,分别记录输入数字和每个数字出现的次数,通过两次遍历找到缺失的数字和重复出现的数字,时间复杂度为 O(N),空间复杂度为 O(1)。
注意: 该代码假设输入数据满足题目描述,即只有一个数字缺失,只有一个数字出现两次,并且所有数字都在 1 到 N 之间。
原文地址: https://www.cveoy.top/t/topic/ntIK 著作权归作者所有。请勿转载和采集!