Python算法例33 删除数字

1. 问题描述

给出一个字符串A,表示一个n位的正整数,删除其中k位数字,使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数,本例将找到删除k个数字之后的最小正整数,其中n≤240,k≤n。

2. 问题示例

给出一个用字符串表示的正整数A和一个整数k,其中A=178542,k=4,返回一个字符串"12"。

3. 代码实现

使用贪心算法实现

基本思路是,我们从左往右遍历字符串A,如果当前数字比下一个数字大,那么就把它删除。重复这个过程,直到我们删掉了k个数字,或者遍历完了整个字符串A。

为什么这个算法可行呢?因为我们希望保留尽量多的高位数字,因为高位数字对于最终的结果影响更大。所以,如果一个数字比它后面的数字大,那么就应该删掉这个数字,这样可以保证剩下的数字尽可能小。

需要注意的是,我们在删除数字的时候,可能会遇到一种特殊情况,即前面几个数字都比后面的数字大,此时我们应该删除最后一个数字。

 

def remove_k_digits(num, k):if k == 0:return numif len(num) <= k:return "0"stack = []for digit in num:while k > 0 and stack and stack[-1] > digit:stack.pop()k -= 1stack.append(digit)# 处理删除数量没有达到k的情况while k > 0:stack.pop()k -= 1# 去除前导零while stack and stack[0] == '0':stack.pop(0)return "".join(stack) if stack else "0"print(remove_k_digits(str(178542), 4))

在这段代码中,我们使用了一个栈来辅助删除数字的操作。对于字符串 num 中的每个数字,我们将其存入栈 stack 中,并进行如下操作:

  1. 如果当前数字比栈顶元素小,则弹出栈顶元素,直到当前数字不再比栈顶元素小,或者已经删除了 k 个数字;
  2. 将当前数字压入栈中。

处理完所有数字之后,如果还剩下 k 个数字没有删除,那么我们从栈顶弹出 k 个数字即可。需要注意的是,由于我们要求最终剩下的数字按照原来的顺序排列,因此我们不能随意地删除数字,可能会导致顺序发生变化。所以,我们只能从后往前删除数字。

最后,我们将栈 stack 转换成字符串并返回。需要注意的是,如果最终结果是空字符串,那么说明原数字全部被删除,返回字符串 "0" 即可。

时间复杂度为 O(n),其中 n 表示字符串 num 的长度。这是因为我们只需要遍历一次字符串 num,并且每个数字最多只会入栈和出栈一次。

空间复杂度为 O(n),因为我们需要使用一个栈来辅助删除数字的操作,栈中最多可以存储整个字符串 num 中的所有数字。

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

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

相关文章

大数据机器学习GAN:生成对抗网络GAN全维度介绍与实战

文章目录 大数据机器学习GAN&#xff1a;生成对抗网络GAN全维度介绍与实战一、引言1.1 生成对抗网络简介1.2 应用领域概览1.3 GAN的重要性 二、理论基础2.1 生成对抗网络的工作原理2.1.1 生成器生成过程 2.1.2 判别器判别过程 2.1.3 训练过程训练代码示例 2.1.4 平衡与收敛 2.2…

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…

国科大图像处理2023速通期末——汇总2017-2019

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2&#xff0c;这将使得显示系统产生比希望的效果更暗的图像&#xff0c;此时伽马校正通常在信号进入显示器前被进行预处理&#xff0c;令p…

HarmonyOS 组件通用属性之通用事件 文档参数讲解(触摸事件)

好 本文 我们来说说触摸事件 字面意思也非常好理解 就是我们手机手指触摸物体触发 我们先在编辑器组件介绍中 找到这个东西的基本用法 Button("跳转").onTouch((event: TouchEvent) > {})最明显的就是 event 的类型变了 点击事件的是 ClickEvent 而这里是 Touc…

ROS TF坐标变换 - 静态坐标变换

目录 一、静态坐标变换&#xff08;C实现&#xff09;二、静态坐标变换&#xff08;Python实现&#xff09; 如前文所属&#xff0c;ROS通过广播的形式告知各模块的位姿关系&#xff0c;接下来详述这一机制的代码实现。 模块间的位置关系有两种类型&#xff0c;一种是相对固定…

Prototype原型模式(创建对象)

原型模式&#xff1a;Prototype 链接&#xff1a;原型模式实例代码 注解 模式定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 ——《设计模式》GoF 目的 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&am…

nginx源码分析-4

这一章内容讲述nginx的模块化。 ngx_module_t&#xff1a;一个结构体&#xff0c;用于描述nginx中的各个模块&#xff0c;其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数&#xff0c;以便nginx在运行时能够正确地加载和管理这些模块。…

每日一题(LeetCode)----二叉树--二叉树的层平均值

每日一题(LeetCode)----二叉树–二叉树的层平均值 1.题目&#xff08;637. 二叉树的层平均值&#xff09; 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root […

TDD-LTE TAU流程

目录 1. TAU成功流程 1.1 空闲态TAU 1.2 连接态TAU 2. TAU失败流程 当UE进入一个小区&#xff0c;该小区所属TAI不在UE保存的TAI list内时&#xff0c;UE发起正常TAU流程&#xff0c;分为IDLE和CONNECTED&#xff08;即切换时&#xff09;下。如果TAU accept分配了一个新的…

计算机组成原理 数据的表示与运算

文章目录 数据的表示与运算数据表示定点数的表示与运算定点数的表示无符号数有符号数定点整数定点小数四码反码补码移码 总结 定点数的运算算术移位原码反码补码总结 逻辑位移循环位移总结 加减运算原码加减法补码加减法 溢出判断采用一位符号位 浮点数的表示与运算表示IEEE 75…

vue3使用vuex

vuex: 状态管理工具 使用场景&#xff1a;用户登录状态 购物车 地理位置 等 数据位置&#xff1a;内存 安装 项目根目录 yarn add vuex 在src目录下新建store文件夹 下面新建index.js src/store/index.js 在main.js中引入并使用 // 导入状态管理工具vuex import store…

PHP特性知识点扫盲 - 下篇

概述 在实际的生产环境中遇到了实际需要解决的问题&#xff0c;需要把服务部署的方式梳理出来&#xff0c;在同一个服务器中部署多个PHP环境&#xff0c;架构图如下&#xff1a; 架构方案 在工作实践中遇到的很多问题的普遍性都是相通的&#xff0c;公司运行的可新项目都是版…