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();
        }
    }
    

      

  • 相关阅读:
    0427-2
    0427-1
    0426html常用标签属性
    HTML,标签学习
    oracle培训,HTML学习
    第三十七天
    第三十六天
    第三十五天
    第四十三天
    第四十二天
  • 原文地址:https://www.cnblogs.com/apanda009/p/7138163.html
Copyright © 2011-2022 走看看