zoukankan      html  css  js  c++  java
  • 402. 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.
    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.

    316. Remove Duplicate Letters

    321. Create Maximum Number

    402. Remove K Digits

    这三道题都用到了 stack 来求原序列中不打乱相对次序的最小子序列的技巧

    while(k>0 && !stack.isEmpty() && stack.peek()>num.charAt(i)) 栈内元素是由大到小排列的, 站内元素也是需要去除的,
    保证最高位的元素最小.所以遍历时碰到比栈内小的元素就pop

    public class Solution {
        public String removeKdigits(String num, int k) {
            int len = num.length();
            //corner case
            if(k==len)        
                return "0";
                
            Stack<Character> stack = new Stack<>();
            int i =0;
            while(i<num.length()){
                //whenever meet a digit which is less than the previous digit, discard the previous one
                while(k>0 && !stack.isEmpty() && stack.peek()>num.charAt(i)){
                    stack.pop();
                    k--;
                }
                stack.push(num.charAt(i));
                i++;
            }
            
            // corner case like "1111"
            while(k>0){
                stack.pop();
                k--;            
            }
            
            //construct the number from the stack
            StringBuilder sb = new StringBuilder();
            while(!stack.isEmpty())
                sb.append(stack.pop());
            sb.reverse();
            
            //remove all the 0 at the head
            while(sb.length()>1 && sb.charAt(0)=='0')
                sb.deleteCharAt(0);
            return sb.toString();
        }
    }
    

      

  • 相关阅读:
    感触
    儿子会走了
    OLB(outlook bar)控件开发计划
    又要上班了
    OLB(outlook bar)控件开发计划
    将Vim打造成完美的IDE神器
    简明 Vim 练级攻略
    Java , C , C++ ,PHP, python 运算符优先级对照表
    史上最强的vimrc文件
    vim学习资料汇总
  • 原文地址:https://www.cnblogs.com/apanda009/p/7138163.html
Copyright © 2011-2022 走看看