“《编程珠玑》(第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

  测试结果为:

  

  结果是正确的。

 

posted @ 2015-03-20 20:43  峰子_仰望阳光  阅读(383)  评论(0编辑  收藏  举报