• [LeetCode] 402. Remove K Digits 去掉K位数字


    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.

    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.

    Example 3:

    Input: num = "10", k = 2
    Output: "0"
    Explanation: Remove all the digits from the number and it is left with nothing which is 0.

    Java:

    public String removeKdigits(String num, int k) {
        if(num.length()==k)
            return "0";
     
        StringBuilder sb = new StringBuilder(num);
        for(int j=0; j<k; j++){
            int i=0;
            while(i<sb.length()-1&&sb.charAt(i)<=sb.charAt(i+1)){
                i++;
            }
            sb.delete(i, i+1);
        }
     
        //remove leading 0's        
        while (sb.length() > 1 && sb.charAt(0)=='0')
            sb.delete(0,1);
     
        if(sb.length()==0){
            return "0";
        }
     
        return sb.toString();
    }  

    Python:

    class Solution(object):
        def removeKdigits(self, num, k):
            """
            :type num: str
            :type k: int
            :rtype: str
            """
            result = []
            for d in num:
                while k and result and result[-1] > d:
                    result.pop()
                    k -= 1
                result.append(d)
            return ''.join(result).lstrip('0')[:-k or None] or '0'
    

    C++:

    class Solution {
    public:
        string removeKdigits(string num, int k) {
            string res = "";
            int n = num.size(), keep = n - k;
            for (char c : num) {
                while (k && res.size() && res.back() > c) {
                    res.pop_back();
                    --k;
                }
                res.push_back(c);
            }
            res.resize(keep);
            while (!res.empty() && res[0] == '0') res.erase(res.begin());
            return res.empty() ? "0" : res;
        }
    };
    

     

    类似题目:

    [LeetCode] 321. Create Maximum Number

    All LeetCode Questions List 题目汇总

     

      

  • 相关阅读:
    hdu5091(线段树+扫描线)
    hdu2874(tarjan)
    hdu4252
    poj2452(RMQ+二分)
    Dragon Balls HDU
    CF803
    poj1962(带权并查集)
    hdu2818(带权并查集)
    GitHub入门之一:使用github下载项目 .
    (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9363843.html
Copyright © 2020-2023  润新知