• “《编程珠玑》(第2版)第1章”:查找一个数列中缺失的一个整数


      这个题目类似于第二章的第一问题(A问题),不过在这里,因为我现在正在学习第一章,所以就先列为第一章的内容。

      今天天铎来访,刚好问了我一个问题:对于1、2、3...100的数列,缺失了一个整数(例如50),那你用什么方法可以找到缺失的这个数?

      我的想法就是上一篇博文提到的位图数据结构。天铎提到的是用高斯以前用过的方法(数列前n项和Sn = (a1+an)*n/2)来解决这个问题。具体是这样子做的:

      1)我们假设数列没有缺失任何数据,利用前n项和公式求得前n项和sumOf1toN;

      2)对实际数列求和(n-1项),求得前n-1项和为sumOfIn;

      3)1)和2)求得的两个值相减就是缺失的整数了。

      这想法真太神奇了(复杂度为n)!赶紧上机试一下:

     1 int findMissing(vector<int> in)
     2 {
     3     int n = in.size() + 1;
     4     int sumOf1toN = (1 + n) * n / 2;
     5 
     6     int sumOfIn = 0;
     7     for (int i = 1; i < n; i++)
     8     {
     9         sumOfIn += in[i - 1];
    10     }
    11 
    12     return sumOf1toN - sumOfIn;
    13 }

      完整程序(包含测试)如下:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 int findMissing(vector<int> in);
     6 
     7 int main()
     8 {
     9     vector<int> in;
    10     cout << "in:";
    11     for (int i = 0; i < 10; i++)
    12     {
    13         if (i != 4)
    14         {
    15             cout << " " << i + 1;
    16             in.push_back(i + 1);
    17         }
    18     }
    19     cout << endl;
    20 
    21     int out = findMissing(in);
    22     if (out == 5)
    23         cout << "Congratulation! You have found the missing one in 'in': " << out << endl;
    24 
    25     return 0;
    26 }
    27 
    28 int findMissing(vector<int> in)
    29 {
    30     int n = in.size() + 1;
    31     int sumOf1toN = (1 + n) * n / 2;
    32 
    33     int sumOfIn = 0;
    34     for (int i = 1; i < n; i++)
    35     {
    36         sumOfIn += in[i - 1];
    37     }
    38 
    39     return sumOf1toN - sumOfIn;
    40 }
    View Code

      测试结果为:

      

      结果是正确的。

  • 相关阅读:
    优雅高效的MyBatis-Plus工具快速入门使用
    mybatis中#{}和${}的区别
    异常处理com.sun.image.codec.jpeg.JPEGImageEncoder
    图片压缩之-JPEGCodec失效替换方案
    Bugly实现app全量更新
    MyBatis下MySqL用户口令不能为空
    java.lang.OutOfMemoryError: PermGen space及其解决方法
    Hibernate or 的用法
    如何理解<base href="<%=basePath%>"
    小程序 wx.request ajax示例
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4354537.html
Copyright © 2020-2023  润新知