找出替换的数字:线性时间复杂度算法
找出替换的数字:线性时间复杂度算法
这道题可以先求出这个序列的和以及1到n的和,相减就可以得到缺失的那个数,再把实际的和减去1到n的和,得到的差就是重复的那个数。注意在求和的过程中要注意溢出问题。
C++ 代码
#include <iostream>
using namespace std;
int main() {
int sum = 0;
int n = 0;
int a, b;
while (cin >> a) {
sum += a;
n++;
}
// 计算1到n的和
int expectedSum = n * (n + 1) / 2;
// 缺失的数字
a = expectedSum - sum;
// 重复的数字
b = sum - expectedSum + a;
cout << a << ' ' << b << endl;
return 0;
}
解释:
- 首先,我们使用一个循环读取输入的数字,并累加它们的和,同时计算数字的个数
n。 - 计算
expectedSum,即 1 到n的和。 - 缺失的数字
a可以通过expectedSum减去实际的和sum来得到。 - 重复的数字
b可以通过实际的和sum减去expectedSum并加上a来得到。
优点:
- 时间复杂度为 O(N),因为我们只遍历一次输入的数字。
- 空间复杂度为 O(1),因为我们只使用了一些常数大小的变量。
注意:
- 由于我们使用
int类型,如果输入数字的总和过大,可能会发生溢出。如果需要处理这种情况,可以考虑使用更大的数据类型,例如long long。 - 代码假设输入的数字之间用空格分隔。如果使用其他分隔符,需要修改代码中的
cin >> a部分。
原文地址: https://www.cveoy.top/t/topic/ntJ4 著作权归作者所有。请勿转载和采集!