题目 Remove K Digits

Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

Note:
The length of num is less than 10002 and will be ≥ k.
The given num does not contain any leading zero.

即给定一个非负数值字符串,要求删除k个字符的情况下数值最小。

测试例子

Example 1

Input: num = “1432219”, k = 3
Output: “1219”
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2

Input: num = “10200”, k = 1
Output: “200”
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

代码

第一版本

/*************************************************************************> File Name: Solution.cpp> Author: Duke-wei> Mail: 13540639584@163.com > Created Time: 2017年10月13日 星期五 15时12分09秒************************************************************************/#include<iostream>
#include<string>
#include<stack>
#include<algorithm>
#include<vector>
using namespace std;
class Solution1{
public://首先简化问题,考虑一次去除一个字符的情况,然后去除k次string removeKdigits(string num, int k) {if(k==num.size()) return "0";for(int i=0;i<k;++i){if(num.size()<=1) return "0";num = removeone(num);//去掉头部0int j = 0;for(;j<num.size()&&num[j]=='0';++j);num = num.substr(j);}if(num.size()==0) return "0";return num;}//一次去除一个字符,通过找规律发现//去除一个字符,即开头非递减序列的最后一个//如1354278 即去除5,5是首个开始递减的字符//如12477589 去除7//如7511 去除7string removeone(string& s){int i = 0;for(;i<s.size()-1;++i){if(s[i]>s[i+1]) break;}string ret = s.substr(0,i);ret += s.substr(i+1);return ret;}
};

第二版本

每次删除一个肯定很慢,所有要遍历一次删除k个,发现这k个字符的规律,就可以通过栈来实现删除,从头入栈,发现比栈顶小,则弹出栈顶,即去除一个字符。

class Solution2{public:string removeKdigits(string num, int k) {if(k==num.size()) return "0";stack<char> sc;int i=0;while(k>0){if(i>=num.size()){sc.pop();--k;}else if(sc.empty()||sc.top()<=num[i]){sc.push(num[i++]);}else{sc.pop();--k;}}while(i<num.size()) sc.push(num[i++]);string ret;while(!sc.empty()){ret.push_back(sc.top());sc.pop();}reverse(ret.begin(),ret.end());i=0;while(i<ret.size()&&ret[i]=='0')++i;if(i==ret.size()) return "0";return ret.substr(i);}
};

第三版本

简化代码,看了大神的代码,简洁,直接用striing替换stack的功能。

class Solution3{public:string removeKdigits(string num, int k) {string ans = "";                                         // treat ans as a stack in below for loopfor (char c : num) {while (ans.length() && ans.back() > c && k) {ans.pop_back();                                  // make sure digits in ans are in ascending orderk--;                                             // remove one char}if (ans.length() || c != '0') { ans.push_back(c); }  // can't have leading '0'}while (ans.length() && k--) { ans.pop_back(); }          // make sure remove k digits in totalreturn ans.empty() ? "0" : ans;}
};

思考扩展

  • 这题明确了该字符串是非负数值,因此如果数值为负则应该怎么处理?
  • 如果要求去除k个后是最大怎么处理?

LeetCode-Remove K Digits相关推荐

  1. LeetCode Remove K Digits

    原题链接在这里:https://leetcode.com/problems/remove-k-digits/description/ 题目: Given a non-negative integer  ...

  2. [LeetCode] 402. Remove K Digits Java

    题目: Given a non-negative integer num represented as a string, remove k digits from the number so tha ...

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

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

  4. leetcode算法题--Remove K Digits

    原题链接:https://leetcode.com/problems/remove-k-digits/ string removeKdigits(string num, int k) {string ...

  5. 贪心:remove K digits移除K个数字

    问题描述: 已知一个使用字符串表示的非负整数num,将num中的k个数字移 除,求移除k个数字后,可以获得的最小的可能的新数字. 例如:num = "1432219" , k = ...

  6. LeetCode:Remove Duplicates from Sorted List I II

    LeetCode:Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such t ...

  7. LeetCode 787. K 站中转内最便宜的航班(图/Bellman Ford算法)

    文章目录 贝尔曼-福特算法(Bellman-Ford) 简介 算法思想 算法执行过程 应用 题目描述 分析 代码 LeetCode 787. K 站中转内最便宜的航班 题目描述 Bellman For ...

  8. LeetCode——787. K 站中转内最便宜的航班(Cheapest Flights Within K Stops)[中等]——分析及代码(Java)

    LeetCode--787. K 站中转内最便宜的航班[Cheapest Flights Within K Stops][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 ( ...

  9. LeetCode 787.K站中转内最便宜的航班

    LeetCode 787.K站中转内最便宜的航班 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 ds ...

最新文章

  1. Win 10操作系统环境下python3.7 实现sklearn 安装
  2. 网络存储技术介绍(1) ( based on zt)
  3. HTML入门第一和第二章
  4. 【转】产品经理如何进行BRD,MRD,PRD,DRD,FRD编写
  5. 《C++ Primer 5th》笔记(8 / 19):IO库
  6. 知识图谱论文阅读(二十)【WWW2020】Heterogeneous Graph Transformer
  7. Apache Flink,流计算?不仅仅是流计算!
  8. 智能合约从入门到精通:Solidity Assembly
  9. 贝叶斯分类器用于文本分类: Multinomial Naïve Bayes
  10. 剑指offer面试题30. 包含min函数的栈(辅助栈)
  11. mysql cmmand not found
  12. 黑马程序员—银行调度系统
  13. waitpid status参数介绍
  14. 腾讯云服务器挂载云硬盘数据盘并初始化云硬盘
  15. easyExcel以Map的形式读取参数
  16. php 之session 进行时
  17. 利用 python numpy +matplotlib 绘制股票k线图
  18. LintCode 木材加工
  19. 使用Web登录防火墙设备
  20. 【Java位运算】异或运算的使用

热门文章

  1. 对word文档中指定的相同内容/文字加颜色或背景颜色
  2. Go append函数
  3. android6 miui9分屏,小米手机如何分屏,MIUI9分屏模式如何开启?
  4. PySpark用saveAsTextFile写入Windows本地文件系统失败java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio
  5. mysql批量更新方法
  6. 转-北大教授健康讲座笔录
  7. 删除某个文件或文件夹时,系统提示无法删除!
  8. 用python来恢复回收站中删除的项目
  9. pip下载速度过慢解决办法
  10. linux自动下载壁纸,使用 LSWC 在 Linux 中自动更改壁纸