算法(蓝桥杯)贪心算法5——删数问题的解题思路

问题描述

给定一个高精度的正整数 n(n≤1000 位),需要删除其中任意 s 个数字,使得剩下的数字按原左右顺序组成一个新的正整数,并且这个新的正整数最小。例如,对于数字 153748,删除 2 个数字后,最小的数是 1348。


解题思路

1. 贪心算法

要解决这个问题,我们可以使用贪心算法。贪心算法在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的。

2. 维护单调递增栈

我们可以通过维护一个单调递增的栈来实现这个目标。具体步骤如下:

2.1 初始化栈

创建一个空栈 stack,用于存储最终结果中的数字。

2.2 遍历每个数字

遍历输入的高精度正整数 n 的每一位数字 num

2.3 维护单调递增栈
  • 弹出条件:当栈不为空(stack),且还需要删除数字(s > 0),且栈顶元素大于当前数字(stack[-1] > num)时,弹出栈顶元素,并减少 s 的值。这样做的目的是尽可能地让结果数的高位更小,从而使得整个数更小。

  • 入栈操作:将当前数字 num 入栈。这一步是为了保留当前数字,以便后续继续判断。

2.4 处理剩余的删除操作

遍历结束后,如果 s 还大于0,说明原数是单调递增的。在这种情况下,直接去掉末尾的 s 个数字即可。因为从末尾去掉数字对结果数的影响最小。

2.5 拼接结果并处理前导0
  • 拼接结果:将栈中的数字拼接成一个字符串。

  • 处理前导0:使用 lstrip('0') 去掉前导0。如果去掉前导0后字符串为空(即原数删除后只剩下0),则返回 '0'

3. 示例解释

n = "153748"s = 2 为例,详细说明每一步的操作:

  1. 初始化栈stack = []

  2. 遍历每一位数字

    • num = '1':栈为空,直接入栈。stack = ['1']

    • num = '5':栈顶元素 '1' 小于 '5',直接入栈。stack = ['1', '5']

    • num = '3':栈顶元素 '5' 大于 '3',弹出 '5's 减1。stack = ['1']。然后 '3' 入栈。stack = ['1', '3']

    • num = '7':栈顶元素 '3' 小于 '7',直接入栈。stack = ['1', '3', '7']

    • num = '4':栈顶元素 '7' 大于 '4',弹出 '7's 减1。stack = ['1', '3']。然后 '4' 入栈。stack = ['1', '3', '4']

    • num = '8':栈顶元素 '4' 小于 '8',直接入栈。stack = ['1', '3', '4', '8']

  3. 遍历结束后s 为0,不需要再处理。

  4. 拼接结果并处理前导0''.join(stack).lstrip('0'),结果为 '1348'

最终结果为 '1348',这是删除2个数字后得到的最小数。

4. 代码实现

def min_number_after_delete(n, s):"""删除s个数字后得到的最小数:param n: 原始高精度正整数,字符串形式:param s: 需要删除的数字个数:return: 删除s个数字后得到的最小数,字符串形式"""stack = []# 遍历每个数字for num in n:# 当栈不为空且s大于0且栈顶元素大于当前数字时,弹出栈顶元素while stack and s > 0 and stack[-1] > num:stack.pop()s -= 1# 当前数字入栈stack.append(num)# 如果s还大于0,说明原数是单调递增的,直接去掉末尾的s个数字即可if s > 0:stack = stack[:-s]# 将栈中的数字拼接成字符串,并去掉前导0return ''.join(stack).lstrip('0') or '0'# 示例
n = "153748"
s = 2
print(min_number_after_delete(n, s))  # 输出:1348n = "1087"
s = 1
print(min_number_after_delete(n, s))  # 输出:87

5. 总结

通过维护一个单调递增的栈,我们可以有效地找到删除 s 个数字后得到的最小数。这种方法的时间复杂度为 O(n),其中 n 是输入数字的长度,因为每个数字最多只会被入栈和出栈一次。希望这个解释能帮助你更好地理解这个问题的解法。如果有任何疑问,欢迎继续提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

元素隐式具有 “any” 类型,因为类型为 “string” 的表达式不能用于索引类型 “{ minLon: string; maxLon: string; minLat: string; maxLat: string; minTime: string; maxTime: string; keyword: string; subjct: string; ele: string; }”。 在类型 “{ minLon:…

《探秘鸿蒙NEXT中的人工智能核心架构》

在当今科技飞速发展的时代,华为HarmonyOS NEXT的发布无疑是操作系统领域的一颗重磅炸弹,其将人工智能与操作系统深度融合,开启了智能新时代。那么,鸿蒙NEXT中人工智能的核心架构究竟是怎样的呢?让我们一同探秘。 基础…

git克隆原项目到新目录,保留提交记录分支等,与原项目保持各自独立

1、克隆原仓库到本地 --mirror 会完整克隆所有git数据,包括所有分支、标签、提交记录 git clone --mirror http://gitlab.com.../old-project.git2、进入文件夹 cd old-project.git3、添加目录仓库为远程 xx-orgin表示给远程地址命名 git remote add xx-orgin htt…

U盘被格式化后的数据救赎与防范策略

一、U盘格式化后的数据困境 在日常的工作与生活中,U盘作为数据传输与存储的重要工具,扮演着不可或缺的角色。然而,当U盘不幸遭遇格式化操作后,存储在其中的宝贵数据瞬间化为乌有,给用户带来极大的困扰。格式化后的U盘…

PyBroker:利用 Python 和机器学习助力算法交易

PyBroker:利用 Python 和机器学习助力算法交易 你是否希望借助 Python 和机器学习的力量来优化你的交易策略?那么你需要了解一下 PyBroker!这个 Python 框架专为开发算法交易策略而设计,尤其关注使用机器学习的策略。借助 PyBrok…

【AI论文】LlamaV-o1:重新思考大型语言模型(LLMs)中的逐步视觉推理方法

摘要:推理是解决复杂多步骤问题的基本能力,特别是在需要逐步顺序理解的视觉环境中尤为重要。现有的方法缺乏一个全面的视觉推理评估框架,并且不强调逐步解决问题。为此,我们通过三项关键贡献,提出了一个在大型语言模型…

【HTTP】详解

目录 HTTP 基本概念啥是HTTP,有什么用?一次HTTP请求的过程当你在浏览器中输入一个浏览器地址,它会发送什么 ?---(底层流程)HTTP的协议头请求头(对应客户端)一些请求头请求方法 响应头…

EasyExcel - 行合并策略(二级列表)

😼前言:博主在工作中又遇到了新的excel导出挑战:需要导出多条文章及其下联合作者的信息,简单的来说是一个二级列表的数据结构。 🕵️‍♂️思路:excel导出实际上是一行一行的记录,再根据条件对其…

第9章:基于Vision Transformer(ViT)网络实现的迁移学习图像分类任务:早期秧苗图像识别

目录 1. ViT 模型 2. 早期秧苗分类 2.1 数据集 2.2 训练 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. ViT 模型 视觉变换器(ViT)是一种神经网络架构,它将变换器架构的原理应用于视觉数据。最初,Transformers主要用于自然…

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求:做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息, 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…

OpenHarmony API 设计规范

OpenHarmony API 设计规范 修订记录 版本作者时间更新内容v0.1,试运行版OpenHarmony API SIG2022年11月初版发布 目的 API是软件实现者提供给使用者在编程界面上的定义,API在很大程度上体现了软件实体的能力范围。 同时,API定义的好坏极…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想:数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架: create-react-app ,目前使用它安装默认是19版本,我们这里降为18…

Linux手写FrameBuffer任意引脚驱动spi屏幕

一、硬件设备 开发板:香橙派 5Plus,cpu:RK3588,带有 40pin 外接引脚。 屏幕:SPI 协议 0.96 寸 OLED。 二、需求 主要是想给板子增加一个可视化的监视器,并且主页面可调。 平时跑个模型或者服务,…

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…

React Native的现状与未来:从发展到展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

数据结构——链表(概念,类型,java实现、增删、优缺点)

我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴&#xff0…

app版本控制java后端接口版本管理

java api version 版本控制 java接口版本管理 1 自定义 AppVersionHandleMapping 自定义AppVersionHandleMapping实现RequestMappingHandlerMapping里面的方法 public class AppVersionHandleMapping extends RequestMappingHandlerMapping {Overrideprotected RequestCondit…

LRU 算法详解与 Java 的两种实现方式

LRU 算法详解与 Java 的两种实现方式 LRU 算法详解与 Java 的两种实现方式一、LRU 算法简介二、LRU 算法原理三、LRU 算法应用场景四、Java 实现 LRU 算法(一)基于 LinkedHashMap 实现(二)基于双向链表和 HashMap 实现五、总结LRU 算法详解与 Java 的两种实现方式 一、LRU…

基于 Python 的财经数据接口库:AKShare

AKShare 是基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。 安装 安装手册见…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容,MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令,你需要找到 mysql 可执行文件的路径。 在 macOS 上,mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此,完整的路径应该是&#xff1…