这个题目类似于第二章的第一问题(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 }
测试结果为:
结果是正确的。