【C++】求第二大的数详细解析

文章目录
- 💯前言
- 💯题目描述
- 💯输入描述
- 💯解题思路分析
- 1. 题目核心要求
- 2. 代码实现与解析
- 3. 核心逻辑逐步解析
- 定义并初始化变量
- 遍历并处理输入数据
- 更新最大值与次大值
- 输出结果
- 4. 示例分析
- 示例输入
- 示例输出
- 数据处理过程
- 💯高级拓展与优化分析
- 时间与空间复杂度
- 潜在错误与改进方向
- 数学与工程意义
- 💯多种解法的对比与讨论
- 排序法
- 分治法
- 💯小结

💯前言
- 在计算机科学和算法设计领域,如何以最优的方式处理有限的资源和数据一直是一个重要的研究课题。针对这一问题,本次探讨围绕一个经典的编程挑战展开:
寻找数列中的次大值。本题虽然在描述上简洁,但通过限制变量和数据结构的使用,从而将重点放在动态维护状态变量和优化算法性能上。这不仅为基础算法设计提供了宝贵的训练机会,同时也为解决实际工程中的资源约束问题提供了可借鉴的思路。
本次分析将从题目背景、算法设计、代码实现、扩展优化及多解法对比等多个角度,系统地探讨这一问题的本质及其实现方法。
C++ 参考手册

💯题目描述
![]()
数学里有一个函数定义为 max(a, b),它返回 a 和 b 中较大的那个值。基于这一定义,现要求完成一个函数 max2,旨在从当前已经处理过的所有输入数字中,返回次大值。
需要注意的是,本题对代码实现有如下明确限制:
- 只能使用两个全局变量
a1和a2分别记录当前最大值和次大值。 - 不允许使用数组或其他结构存储所有输入的数字。
- 允许额外使用两个局部变量用于存储整数个数 n 和当前输入的整数。
💯输入描述
![]()
第一行输入一个整数 n,表示有 n 个正整数满足 2 ≤ n ≤ 100 2 \leq n \leq 100 2≤n≤100。
第二行输入 n 个互不相等的正整数。
输出描述
输出仅包含一个整数,即输入数列中的次大值。
示例1
输入:
10
10 9 8 7 6 5 4 3 2 1
输出:
9
💯解题思路分析
![]()
1. 题目核心要求
![]()
本题的核心在于从输入数据中以高效方式求解次大值,同时遵守以下条件约束:
- 输入正整数各不相同,保证了最大值和次大值的存在性。
- 只能使用两个变量
a1和a2存储结果状态,考验算法设计对空间资源的优化。 - 需要保证算法能够在线性时间内完成计算,即时间复杂度为 O ( n ) O(n) O(n)。
2. 代码实现与解析
以下是问题的完整代码实现:
#include <iostream>
using namespace std;
#include <climits>void max2() {int n;cin >> n; // 读取正整数个数int a1 = INT_MIN; // 最大值初始化为最小整数int a2 = INT_MIN; // 次大值初始化为最小整数for (int i = 0; i < n; ++i) {int num;cin >> num; // 逐一读取每个正整数if (num > a1) {// 当前数字比最大值大,则更新最大值和次大值a2 = a1;a1 = num;} else if (num > a2) {// 当前数字介于最大值和次大值之间,更新次大值a2 = num;}}cout << a2 << endl; // 输出次大值
}int main() {max2();return 0;
}

3. 核心逻辑逐步解析
![]()
定义并初始化变量
![]()
int a1 = INT_MIN;
int a2 = INT_MIN;
- 目的:
a1用于记录当前的最大值。a2用于记录当前的次大值。- 初始化为
INT_MIN,以确保任何正整数输入都可以覆盖初始值。
遍历并处理输入数据
![]()
for (int i = 0; i < n; ++i) {int num;cin >> num;
- 使用
for循环逐一读取正整数,并对每个输入值进行处理。 - 每次读取到的新数字需要根据与
a1和a2的关系进行条件判断。
更新最大值与次大值
![]()
if (num > a1) {a2 = a1;a1 = num;
} else if (num > a2) {a2 = num;
}
- 逻辑分析:
- 当
num > a1时:- 原最大值
a1退化为次大值a2。 - 新数字
num成为新的最大值a1。
- 原最大值
- 当
num位于最大值a1和次大值a2之间时:- 更新
a2为当前数字num。
- 更新
- 当
输出结果
![]()
cout << a2 << endl;
- 循环结束后,
a2中存储的是次大值,直接输出。
4. 示例分析

示例输入
![]()
10
10 9 8 7 6 5 4 3 2 1
示例输出
![]()
9
数据处理过程
![]()
| 迭代次数 | 当前数字 (num) | 最大值 (a1) | 次大值 (a2) |
|---|---|---|---|
| 1 | 10 | 10 | INT_MIN |
| 2 | 9 | 10 | 9 |
| 3 | 8 | 10 | 9 |
| … | … | … | … |
| 10 | 1 | 10 | 9 |
最终结果:次大值为 9。
💯高级拓展与优化分析
![]()
时间与空间复杂度
![]()
- 时间复杂度:
- 对输入数据的单次遍历,复杂度为 O ( n ) O(n) O(n),与数据规模呈线性关系。
- 空间复杂度:
- 仅使用两个额外变量
a1和a2,复杂度为 O ( 1 ) O(1) O(1)。
- 仅使用两个额外变量
潜在错误与改进方向
![]()
-
初始化问题
- 如果未正确初始化
a1和a2,例如初始化为0,在输入为负数时会导致错误。 - 为避免此类问题,需始终选择合适的初始值,例如
INT_MIN。
- 如果未正确初始化
-
边界条件处理
- 当 ( n = 2 ) 时,代码需要保证能够正确处理这类极小输入规模的场景。
-
逻辑健壮性
- 对于更复杂的输入场景(如输入中存在重复值或非法值),需增加必要的输入校验逻辑。
数学与工程意义
![]()
从数学角度来看,本题的核心问题是动态维护“前两大值”。这类问题在实际工程中有广泛应用,例如:
- 流式数据处理:实时更新数据流的统计特性。
- 排名问题:动态维护某指标的前 k 个最大值。
在资源受限的场景下(如嵌入式设备或内存有限的系统),设计类似的轻量级算法尤为重要。
💯多种解法的对比与讨论
![]()
排序法
- 思路:对输入数据排序,取倒数第二个值。
- 时间复杂度: O ( n log n ) O(n \log n) O(nlogn)。
- 缺点:额外的空间和时间开销。

分治法
- 思路:递归分组寻找最大值和次大值。
- 时间复杂度:接近 O ( n ) O(n) O(n)。
- 缺点:代码复杂度较高,且在小规模数据上优势不明显。

💯小结

通过本题,我们可以清晰认识到在有限资源条件下,如何设计高效算法以满足问题需求。这不仅考察了程序的正确性,还着重强调了代码的优化能力和设计美感。
这种能力的培养需要长期的练习和理论积累,同时在不同场景中总结经验。更重要的是,这类问题的解决思路能够拓展到更广泛的工程实践中,例如实时数据分析、大规模流数据处理等领域,为构建更高效的系统打下坚实基础。

相关文章:
【C++】求第二大的数详细解析
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯输入描述💯解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…...
从零开始学TiDB(3)TiKV 持久化机制
如图,每个TiKV有两个rocksdb实例,rocksdbKV复制存储键值对,rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似,在OB中每个Unit及其副本构成了paxos组,在TiDB中叫raft…...
Elasticsearch+Kibana+IK分词器+拼音分词器安装
目录 ES报错 Kibanaik分词器拼音分词器 安装都比较简单,可以参考这几篇博客 ES 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch 报错 ES启动报错error downloading geoip database [GeoLite2-ASN.mmdb] Kibana KIBANA的安装教程ÿ…...
子网划分实例
看到有人问这个问题: 想了一下,这是一个子网划分的问题: 处理方法如图: 这是一个子网划分的问题 设备1用三层交换机,端口设置为路由模式,设备2和设备3为傻瓜交换机模式 设备2和设备3下挂设备都是26为掩码&…...
上海亚商投顾:创业板指震荡调整 机器人概念股再度爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落,深成指、创业板指盘中跌超1%,尾盘跌幅有所收窄。机器人概念股逆势爆…...
【C++ 20进阶(2):初始化 Initializer
【C 20进阶(2):初始化 Initializer】 原文:https://blog.csdn.net/weixin_44259356/article/details/144377955 引言 本篇文章为系列文章将着重介绍C20新特性,一是希望可以和大家交流分享,二是也便于自己…...
【重生之我在B站学MySQL】
MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…...
Python实现中国象棋
探索中国象棋 Python 代码实现:从规则逻辑到游戏呈现 中国象棋,这款源远流长的棋类游戏,承载着深厚的文化底蕴与策略智慧。如今,借助 Python 与 Pygame 库,我们能够在数字世界中复刻其魅力,深入探究代码背后…...
LBS 开发微课堂|通过openGL ES轻松实现建筑物渲染及动画
为了让广大开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务(LBS)开发微课堂” 系列技术案例 第五期的主题是 通过openGL ES轻松实现 建筑物渲染及动画 对于…...
map1[item.id]和map1.get(item.id)的区别为何前者取出的是空,后者取出的是正确的值
在 JavaScript 中,map1[item.id] 和 map1.get(item.id) 用于从 Map 对象中获取值,但它们的工作方式有所不同: map1[item.id]:这种方式用于普通对象(Object),它将 item.id 作为键来获取对应的值…...
window端sqlplus连接linux_oracle11g
1. 环境配置回顾 下载 Oracle Instant Client:根据查询到的版本到链接: oracle官网下载对应版本的三个文件(比如我这里查询到的版本是12.2.0.1.0): instantclient-basic-windows.x64-12.2.0.1.0.zip instantclient-sqlplus-win…...
Go支付中台方案:多平台兼容与多项目对接
一、中台的概念 中台是一种企业级的架构模式,它处于前台应用和后台资源之间,将企业核心能力进行整合、封装,形成一系列可复用的业务能力组件。这些组件就像乐高积木一样,可以被不同的前台业务快速调用,从而避免重复开…...
MySQL触发器的使用详解
MySQL触发器的使用详解 MySQL触发器是一种特殊的存储过程,它与表操作紧密相关,并且在特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事…...
关于NLP交互式系统的一些基础入门
【1】What 基于自然语言处理(NLP)的交互式系统是指能够理解、解析并生成人类自然语言的计算机程序。这些系统旨在通过文本或语音与用户进行交流,以提供信息、解决问题或执行任务。以下是关于这类系统的一些关键点: 核心技术&…...
如何在HTML中修改光标的位置(全面版)
如何在HTML中修改光标的位置(全面版) 在Web开发中,控制光标位置是一个重要的技巧,尤其是在表单处理、富文本编辑器开发或格式化输入的场景中。HTML中的光标位置操作不仅适用于表单元素(如<input>和<textarea…...
PHP8 动态属性被弃用兼容方案
PHP 类中可以动态设置和获取没有声明过的类属性。这些属性不遵循具体的规则,并且需要使用 __get() 和 __set() 魔术方法对动态属性如何读写进行有效控制。 class User {private int $uid; }$user new User(); $user->name Foo; 上述代码中,User 类…...
WPF表格控件的列利用模块适配动态枚举类
将枚举列表转化到类内部赋值,在初始化表格行加载和双击事件时,触发类里面的枚举列表的赋值 <c1:Column Header"变更类型" Binding"{Binding ChangeType, ModeTwoWay, ValidatesOnExceptionsTrue, ValidatesOnDataErrorsTrue, NotifyOn…...
【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面
sgUploadImage源码 <template><div :class"$options.name"><ul class"uploadImages"><liclass"uploadImage"v-loading"loadings[i]"v-for"(a, i) in uploadImages":key"i"click"click…...
Scala的隐式转换
一: 1.隐式转换概述: 隐式转换与模式匹配都是scala中提供的比较强大的特性。 2.隐式转换的定义: 在实际编程中,要想把一个不匹配的类型赋值,需要先转换成匹配的类型。scala的隐式转换会自动将一种类型的数据转换成…...
从视频编码的进化历程看技术革新
人类对影像的记录和传播从未停止。从最早的胶片电影到如今的数字视频,技术在不断演进。在这个过程中,视频编码技术的发展扮演着关键角色,它决定着我们如何高效地存储和传输视频内容。 视频编码技术的发展历程充满智慧。上世纪90年代…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
