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

  这个题目类似于第二章的第一问题(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 }

  测试结果为:

  

  结果是正确的。

时间: 2024-10-16 09:43:52

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

Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

第一章 Thread导论 为何要用Thread ? 非阻塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机执行的应用程序任务(task). 只有一个线程的例子: public class Factorial { public static void main(String[] args) { int n = 5; System.ou

对一千万条数据进行排序---编程珠玑第二版 第一章

本书第一章提出了一个看似简单的问题,有最多1000万条不同的整型数据存在于硬盘的文件中,如何在1M内存的情况下对其进行尽可能快的排序. 每个数字用4byte,1M即可存储250 000个数据,显然,只要每次对250 000个数据排序,写入到文件中即可,重复40次. 那么如何选出每次遍历的二十五万条数据呢?有如下两个策略: 1.对一千万条数据遍历40次,第i次遍历时,判断数是否属于[i*250000,i*250000+249999),如果是,则读入内存,当第i次遍历完成时,内 存中有了二十五万条数

在Win7(64位)使用VS2015运行《OpenGL编程指南》第八版第一章程序的方法

前言:笔者第一次用vs2015来实现<OpenGL编程指南>第八版第一个程序时确实花费了不少时间,按照网上教程,尝试了各种方法,最终花费了两个上午加一个下午的时间, 成功运行了程序,花了这么多时间,确实让人懊恼,现在把运行程序的步骤记录下来,以便查阅. 1.第一步,下载oglpg-8th-edith. 如果去书本上的官网下载,下载的是第九版的,而不是第八版的源码. 去其他网站下载,下载的这个包里面没有第一章的源码,可以网上黏贴其他人的代码,建议下第八版源码,下载网址:链接:http://pan

编程珠玑 第2版 pdf

下载地址:网盘下载 内容简介  · · · · · · 本书是计算机科学方面的经典名著.书的内容围绕程序设计人员面对的一系列实际问题展开.作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的.本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路.本书对各个层次的程序员都具有很高的阅读价值.. 多年以来,当程序员们推选

Pro ASP.NET Core MVC 第6版 第一章

第一章 ASP.NET Core MVC 的前世今生 ASP.NET Core MVC 是一个微软公司开发的Web应用程序开发框架,它结合了MVC架构的高效性和简洁性,敏捷开发的思想和技术,和.NET 平台的最好的部分.在本章,我们将学习为什么微软创建ASP.NET Core MVC, 看看他和他的前辈的比较以及和其他类似框架的比较,最后,大概讲一下ASP.NET core MVC里面有什么新东西,还有本书中包括哪些内容. 了解ASP.NET Core MVC的历史 最开始的ASP.NET 诞生

Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)

前沿 学习Windows核心编程是步入Windows编程殿堂的必经之路,2018年寒假重温了计算机操作系统知识,前阵子又过学习Windows程序设计方面的基础,正所谓打铁要乘热,所以我又入了Windows核心编程的坑啦,哈哈~ 学习目标 每一章的学习都要明确一个目标,就是你学完这一章之后你能做些什么?好的,我们一步步来学习第一章节错误处理.以下是这一章节的学习目标:1.了解Windows函数的错误机制2.了解GetLastError和SetLastError函数的使用3.了解FormatMess

精通ios开发第六版,第一章,文章中的例子及习题.

第一章 1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 10 - (IBAction)buttonPressed:(UIButton *)sender { 11 //取出按钮的title 12 NSString *title = [sender titleForState:UIControlStateNormal];

Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

第一章 Thread导论 为何要用Thread ? 非堵塞I/O I/O多路技术 轮询(polling) 信号 警告(Alarm)和定时器(Timer) 独立的任务(Task) 并行算法 第二章 Thread的创建与管理 一.什么是Thread ? Thread是所在主机运行的应用程序任务(task). 仅仅有一个线程的样例: public class Factorial { public static void main(String[] args) { int n = 5; System.o

Java编程思想第四版第二章练习题答案

练习1:创建一个类,它包含一个int域和一个char域,它们都没有被初始化.将他们的值打印出来,以验证Java执行了默认初始化 public class JavaThinking { private static int i; private static char c; public static void main(String[] args){ System.out.println(i); System.out.println(c); //这里char的默认值为'\u0000'可以这样输出