找出替换的数字:线性时间复杂度算法

这道题可以先求出这个序列的和以及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;
}

解释:

  1. 首先,我们使用一个循环读取输入的数字,并累加它们的和,同时计算数字的个数 n
  2. 计算 expectedSum,即 1 到 n 的和。
  3. 缺失的数字 a 可以通过 expectedSum 减去实际的和 sum 来得到。
  4. 重复的数字 b 可以通过实际的和 sum 减去 expectedSum 并加上 a 来得到。

优点:

  • 时间复杂度为 O(N),因为我们只遍历一次输入的数字。
  • 空间复杂度为 O(1),因为我们只使用了一些常数大小的变量。

注意:

  • 由于我们使用 int 类型,如果输入数字的总和过大,可能会发生溢出。如果需要处理这种情况,可以考虑使用更大的数据类型,例如 long long
  • 代码假设输入的数字之间用空格分隔。如果使用其他分隔符,需要修改代码中的 cin >> a 部分。
找出替换的数字:线性时间复杂度算法

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

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