思路

这道题让我们从一个字符串数字中删除 k 个数字,使得剩下的数最小。也就说,我们要保持原来的数字的相对位置不变。

以题目中的 num = 1432219, k = 3 为例,我们需要返回一个长度为 4 的字符串,问题在于: 我们怎么才能求出这四个位置依次是什么呢?


这里有一个前置知识:对于两个数 123a456 和 123b456,如果 a > b, 那么数字 123a456 大于 数字 123b456,否则数字 123a456 小于等于数字 123b456。也就说,两个相同位数的数字大小关系取决于第一个不同的数的大小。

因此我们的思路就是:
1、从左到右遍历。
2、对于遍历到的元素,我们选择保留。
3、但是我们可以选择性丢弃前面相邻的元素。

以题目中的 num = 1432219, k = 3 为例的图解过程如下:
1、

由于没有左侧相邻元素,因此没办法丢弃。

2、

由于 4 比左侧相邻的 1 大。如果选择丢弃左侧的 1,那么会使得剩下的数字更大(开头的数从 1 变成了 4)。因此我们仍然选择不丢弃。

3、

由于 3 比左侧相邻的 4 小。 如果选择丢弃左侧的 4,那么会使得剩下的数字更小(开头的数从 4 变成了 3)。因此我们选择丢弃。

然而需要注意的是,如果给定的数字是一个单调递增的数字,那么我们的算法会永远选择不丢弃。这个题目中要求的,我们要永远确保丢弃 k 个矛盾。

题目要求我们丢弃 k 个。反过来说,不就是让我们保留 n - k个元素么?其中 n 为数字长度。 那么我们只需要按照上面的方法遍历完成之后,再截取前n - k个元素即可。

class Solution {public:string removeKdigits(string num, int k) {int size=num.size();if(size==k) return "0";int need=size-k;//要求删掉k个元素,则最后需要保留size-k个元素//stack<string> st;string res;for(int ii=0;ii<size;ii++){char temp=num[ii];//还需要丢弃并且栈内还有元素供我们丢弃并且栈顶元素比当前遍历的元素大,那么就需要丢弃栈顶元素,使得整体变小while(k>0&&!res.empty()&&res[res.size()-1]>temp){res.pop_back();k--;}res+=temp;}res=res.substr(0,need);//循环删除前导0 如"0","001"while(*res.begin()=='0'&&res.size()!=1){res.erase(res.begin());//顺序容器内部删除一个元素用erase,这个函数会返回下一个有效的迭代器}return res;}
};

TX笔试:
我们定义两个长度相等的字符串比较最优时,字典序大的那个是更优的。

现在给你一个字符串s,字符串的元素全是小写英文字母a~z,你可以在这个字符串中按顺序选择一个长度为k的子序列(可以不连续),现在想问你最优子序列是什么。

两个长度相等的字符串的字典序的比较规则如下:
比较它们第一次出现的不相等的字母,该字母大的那个字符串字典序更大,例如: “abac” 大于"aazy",因为第一次出现的不等字母是第2个,且’b’ 大于’a’。

#include <string>
#include <vector>
#include <iostream>
using namespace std;int main(){int n,k;//序列长度和选择元素的个数cin>>n>>k;string s;cin>>s;int size=s.size();int KK=size-k;//需要删除的元素个数int need=k;//最后需要的元素个数string res;for(int ii=0;ii<size;ii++){char temp=s[ii];while(KK>0&&!res.empty()&&res[res.size()-1]<temp){res.pop_back();KK--;}res+=temp;}res=res.substr(0,need);cout<<res<<endl;}

402.移掉K位数字,使得剩下数字最小相关推荐

  1. LeetCode 402. 移掉K位数字 中等难度

    402. 移掉K位数字 题目: 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导 ...

  2. Java实现 LeetCode 402 移掉K位数字

    402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...

  3. 402. 移掉K位数字(单调栈)

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : 输入: nu ...

  4. LeetCode 402. 移掉K位数字(贪心,单调栈)

    1. 题目 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : ...

  5. C++算法学习(力扣:402. 移掉K位数字)

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : 输入: nu ...

  6. 402. 移掉K位数字 golang

    测试用例 示例 2 : 输入: num = "10200", k = 1 输出: "200" 解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何 ...

  7. leetcode 402. 移掉K位数字(贪心算法)

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : 输入: nu ...

  8. leetcode 402. Remove K Digits | 402. 移掉 K 位数字(单调栈)

    题目 https://leetcode.com/problems/remove-k-digits/ 题解 本题考察对问题的抽象能力,多写几个例子可以发现,这是一个单调栈问题,维护一个单调不减栈. cl ...

  9. 【LeetCode题解】402.移掉K位数字问题

    移掉K位数字问题 1.题目描述 2.题解 3.进阶版解法 1.题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num的长度小于10002,且 ...

最新文章

  1. 四步相移法怎么获得相位信息_涨知识!5G的调制方式,到底是怎么实现的?
  2. linux中useradd的文件路径,linux的useradd命令详细解释
  3. 车用TVS管 SM8S系列 国产替代
  4. 【软件】我安装Tomcat5.5(Java Web开发服务器)的几点经验
  5. 图解 Python 算法
  6. 零基础入门深度学习 | 第一章:感知器
  7. python_程序的构成---python工作笔记015
  8. 动态绘制柱状图饼状图
  9. windows 常用快捷键与重要文件的路径
  10. window和document对象
  11. MySQL 游标(CURSOR)
  12. 异数OS国产CPU平台移植项目需求分析
  13. recovery 调试
  14. 计算机月考分析报告,月考分析总结500字(通用7篇)
  15. iOS动画:3D动画(18)
  16. android开发截屏代码,android截屏代码:C++实现
  17. 第14章 14.1 来自Bitly的USA.gov数据(1)
  18. 微信热搜榜、订阅热词API
  19. 谷歌地图实现车辆位置实时跟踪
  20. 某游戏彩票外企Java面试题

热门文章

  1. XAML和VBA 7规范发布
  2. mysql常用的约束_MySQL常用的约束条件
  3. [Python图像处理] 二十七.OpenGL入门及绘制基本图形(一)
  4. 【数据结构与算法】之深入解析“等差数列划分II”的求解思路与算法示例
  5. 【数据结构与算法】之深入解析“二叉树展开为链表”的求解思路与算法示例
  6. Swift之字符串String的常规操作和处理
  7. 《数据库原理与应用》(第三版)第 1 章 数据库概述 习题参考答案
  8. 机器人写诗项目——数据预处理
  9. 信息学奥赛一本通(C++)在线评测系统——基础(二)基础算法 —— 1312:【例3.4】昆虫繁殖
  10. 【Linux】一步一步学Linux——whatis命令(14)