Leetcode402 remove-k-digits贪心+vector模拟栈的思想
题目
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :
输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :
输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。
来源:力扣(LeetCode)
链接:原题链接
实现思路
贪心规律:从高位向低位遍历,如果对应的数字>下一位数字,则把该位去掉得到的数字最小。
相邻位进行比较,两者小的进栈
(这里需要注意存在零的情况。举例,“10234” ,0比1小,1出栈,0入栈,此时如果0位于栈底,最后弹出显示则0位于首位,这是错误的)
栈顶弹出条件是:
- 栈非空,
- k大于0,
- 栈顶元素>后面的元素
接下来如果不是0,则可以直接进栈。
如果是0,需要考虑之前的栈非空。
这里结合为一句代码:
if(number!=0||!v.empty())v.push_back(number); //使用vector实现栈的思想
核心代码
for(size_t i=0;i<num.size();++i){number=num[i]-'0';//转换为数字while(k>0&&!v.empty()&&v.back()>number)//弹出栈顶的条件{v.pop_back();//使用vector模拟栈,这里弹出k--;//需要减掉的元素数少1}if(number!=0||!v.empty())v.push_back(number); }
AC代码
class Solution {public:string removeKdigits(string num, int k) {vector<int> v;//模拟栈的思想string result="";int number;for(size_t i=0;i<num.size();++i){number=num[i]-'0';//转换为数字while(k>0&&!v.empty()&&v.back()>number)//弹出栈顶的条件{v.pop_back();k--;}if(number!=0||!v.empty())v.push_back(number); }while(k>0&&!v.empty()){k--;v.pop_back();}//数字转换为字符串for(size_t i=0;i<v.size();++i){result.append(1,v[i]+'0');}if(result=="")//空串return "0";return result;}
};
未考虑到0的情况的代码
问题出现在出现前导0,如下是问题代码
while(k>0&&!v.empty()&&v.back()>number)//弹出栈顶的条件{v.pop_back();k--;}if(number==0){//已知没有前导0v.push_back(number);}else//直接入栈v.push_back(number);}
总结
后续整体添加。也可能遗忘。
数字转换为字符串
使用字符串result的append()函数追加字符
append()函数请参考:博客:C++append()函数的功能
数字转化为字符通过num+'0’
//数字转换为字符串for(size_t i=0;i<v.size();++i){result.append(1,v[i]+'0');}
字符串转化为数字:
这个使用较多,比较简单
字符串转化为数字通过 num-'0’
//一位一位的转换for(size_t i=0;i<num.size();++i){number=num[i]-'0';//转换为数字//后续处理...}
希望对你有帮助。
Leetcode402 remove-k-digits贪心+vector模拟栈的思想相关推荐
- [LeetCode] 402. Remove K Digits Java
题目: Given a non-negative integer num represented as a string, remove k digits from the number so tha ...
- LeetCode Remove K Digits
原题链接在这里:https://leetcode.com/problems/remove-k-digits/description/ 题目: Given a non-negative integer ...
- 贪心:remove K digits移除K个数字
问题描述: 已知一个使用字符串表示的非负整数num,将num中的k个数字移 除,求移除k个数字后,可以获得的最小的可能的新数字. 例如:num = "1432219" , k = ...
- leetcode 402. Remove K Digits | 402. 移掉 K 位数字(单调栈)
题目 https://leetcode.com/problems/remove-k-digits/ 题解 本题考察对问题的抽象能力,多写几个例子可以发现,这是一个单调栈问题,维护一个单调不减栈. cl ...
- leetcode算法题--Remove K Digits
原题链接:https://leetcode.com/problems/remove-k-digits/ string removeKdigits(string num, int k) {string ...
- LeetCode-Remove K Digits
题目 Remove K Digits Given a non-negative integer num represented as a string, remove k digits from th ...
- zjnu 1744 EKSPLOZIJA(模拟栈)
EKSPLOZIJA Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 45 Accepted: 12 Descriptio ...
- c语言栈的实现以及操作_python模拟栈的操作实现非递归方式的快速排序算法
本文首发地址: https://yishuihancheng.blog.csdn.net/article/details/76185032 欢迎关注我的博客[Together_CZ],我是沂水寒城! ...
- SCU4438 Censor(审查员) (KMP算法与模拟栈的应用 || HASH表与模拟栈的结合)
Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text pp. Her j ...
最新文章
- 田渊栋的2021年终总结:多读历史!历史就是一个大规模强化学习训练集
- swiper4自动轮播切换手动触碰后停止踩坑——属性disableOnInteraction
- 管与c++中容量的重新分配问题
- 听说”双11”是这么解决线上bug的
- hibernate.cfg.xml hibernate 配置文件模板
- Transfer Execute Redirect重定向方法介绍
- php 记录报错,php报错自己记录
- go实现本地文件搜索引擎
- 微服务架构的核心要点和实现原理解析
- Portal widget 插入 widget
- day6面向对象--继承、多态
- 多步骤查询的解决方案
- java 单例 初始化_单例数据库对象启动时参数化初始化?
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第1节 基础加强_4_Junit_@Before@After...
- (2)Linux环境下安装和使用Redis
- JavaSE JDK搭建
- 计算机怎么算对数的反函数,Excel 计算对数分布函数反函数:LOGINV函数
- 主成分分析法的SPSS操作
- 微软OneDrive使用体验
- 浅析淘宝数据魔方技术架构
热门文章
- Server Error in '/' Application. 报错
- php插入代码数据库
- [转]深入理解 __doPostBack
- VC中使用全局变量的2种办法及防错措施
- python 数据库表结构转为类_Python数据科学实践 | 数据库1
- 【统计学习方法】决策树
- 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第8章-Lurie 型动态网络自适应牵制控制
- STM32 基础系列教程 19 – WWDG
- Android学习笔记:Activity-ListView
- 【发布】温度监测报警器v1.1a内测版!