当前位置: 首页 > news >正文

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 中的所有数字。

相关文章:

  • 陈述式资源管理(2)
  • 动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper
  • 阿里云2核2G3M服务器上传速度多少?下载速度快吗?
  • 编程语言的进化:智能化与多样化的未来
  • 机器学习之主成分分析(Principal Component Analysis,PCA)案例解析附代码
  • 深度理解Flutter:有状态Widget与无状态Widget的详细对比
  • 华为ipsec双冗余配置案例
  • 为什么游戏服务端用开发效率低的C++来写,其他语言无法胜任吗?
  • Go语言程序设计-第5章--函数
  • 【Swagger】常用注解的使用、SpringBoot的整合及生产环境下屏蔽Swagger
  • [每周一更]-(第43期):Golang版本的升级历程
  • linux安装anaconda
  • 自定义html5中日期选取器的样式
  • uniapp-H5项目的坑
  • 经典卷积神经网络-VGGNet
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 10个确保微服务与容器安全的最佳实践
  • django开发-定时任务的使用
  • JSDuck 与 AngularJS 融合技巧
  • js算法-归并排序(merge_sort)
  • Python_网络编程
  • React Transition Group -- Transition 组件
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • sublime配置文件
  • ubuntu 下nginx安装 并支持https协议
  • underscore源码剖析之整体架构
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 十年未变!安全,谁之责?(下)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • AI算硅基生命吗,为什么?
  • ionic入门之数据绑定显示-1
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • (1)Android开发优化---------UI优化
  • (Git) gitignore基础使用
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)linux下的时间函数使用
  • (转)负载均衡,回话保持,cookie
  • .Net CF下精确的计时器
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 分布式技术比较
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net和jar包windows服务部署
  • .net流程开发平台的一些难点(1)
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .Net中间语言BeforeFieldInit
  • .Net组件程序设计之线程、并发管理(一)
  • [Android 数据通信] android cmwap接入点
  • [Android] Implementation vs API dependency
  • [android] 手机卫士黑名单功能(ListView优化)
  • [Android]使用Android打包Unity工程