《漫画算法》笔记——给定数,求删除k个数字后的最小值

2023-12-22 00:20

本文主要是介绍《漫画算法》笔记——给定数,求删除k个数字后的最小值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  /*** 题目:给定一个数,求 删除k个数字后的最小值* 思路:考虑 “如何删除一个数字,得到最小值”,* 不难想到,应该优先删除“靠前,值大”的数字,* 观察到:如果一个数字大于它右边的那个数字,那么删除它并让自己右边的数顶替上来,必然能够降低整体的数值;* 综上分析,可知:从左向右遍历,找到第一个“自己右边比自己小”的数字*/public static void main(String[] args) {System.out.println(removeKDigits2("1000270936",1));}public static String removeKDigits2(String s,int k){String res=s;for (int i = 0; i < k; i++) {// 准备删除第i+1个数,只删除一个数boolean hasCut=false;// 检查 在res[0,...,res.len-2]中的字符是否被删除for (int j = 0; j < res.length()-1; j++) {if(res.charAt(j)>res.charAt(j+1)){hasCut=true;res=res.substring(0,j)+res.substring(j+1);break;}}if(!hasCut){// 在res[0,...,res.len-2]中的字符都没有被删除,那么删除最后一个字符res=res.substring(0,res.length()-1);}res=removeLeft0s(res);// 删完一个数后,检查左边的0}if(res.length()==0){// 删完了,我觉得没必要加啊return "";}return res;}private static String removeLeft0s(String res) {int i=0;for(;i<res.length();i++){if(res.charAt(i)!='0'){break;}}return res.substring(i);}

上述代码实现的缺点:

  1. 每次删除一个字符,都从剩余字符串的头部开始遍历,这样之前做的“是否存在逆序”检查结果就浪费了。比较节省的思路是,应该考虑接住上次检查的结果,继续进行。
  2. .substring()的底层实现比较费:创建新字符串,并逐个复制字符。
    基于这些缺点,提出使用栈实现上述的思路。具体地,每次遍历到一个新字符,检查它是否大于栈顶,如果是,那么直接把这个新字符压入栈;如果否,那么弹出栈顶(表示删除这个栈顶字符,更新删除次数)。
  • 下面的代码借助char[] stackint top实现了栈的功能,(之所以这样做,我想,是因为后续方便打印出结果)、使用int offset标记第一个非零数字的位置。
 public static String removeKDigits3(String s,int k){int slen=s.length();char[] stack=new char[slen-k];// stack, ready to store the remaining numsint top=0;for (int i = 0; i < slen; i++) {char c=s.charAt(i);while (k>0&&top>0&&stack[top-1]>c){ // !! 栈顶元素是stack[top-1]top--;k--;}stack[top++]=c;}int offset=0;// 记录第一个非零数字的位置for (int i = 0; i < stack.length; i++) {if(stack[i]!='0'){break;}offset++;}
//        System.out.println(stack);return offset==stack.length?"0":new String(stack,offset,stack.length-offset);}

这篇关于《漫画算法》笔记——给定数,求删除k个数字后的最小值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更