zoukankan      html  css  js  c++  java
  • 力扣 402. 移掉K位数字 简单单调栈

    题目链接

        /**
         * 简单单调栈
         * 题目思路是:用栈来读取字符串(从前往后读),如果当前堆顶数字比字符串中的数字大,则抛出(至于为什么能成立,贪心,细节都在代码中)
         *       来个例子
         *               stack    String
         *                 3,3        2       此时抛出 3 (抛出3之后,堆顶元素依然3大于2,接着抛出)
         *
         */
        public String removeKdigits(String num, int k) {
            // 如果字符串为空,或者 K 的值大于字符串的长度
            if (num.length() <= k || num == null) {
                return "0";
            }
            // 栈
            Stack<Character> stack = new Stack<>();
            for (int i = 0; i < num.length(); i++) {
                // 如果栈中没有元素则不需要进行比较
                // 如果栈顶元素大于字符串的数字,才会触发抛出
                while (k > 0 && !stack.isEmpty() && stack.peek() > num.charAt(i)) {
                    k--;
                    //System.out.println("抛出 : " + stack.peek());
                    stack.pop();
                }
                //去除前导零
                if (stack.isEmpty() && num.charAt(i) == '0') {
                    continue;
                }
                stack.add(num.charAt(i));
            }
    
            StringBuilder sb = new StringBuilder();
            // 将堆中的数字放入字符串中
            while (!stack.isEmpty()) {
                // 如果还能减少数字,那么一定是从尾部开始减少(仔细想想为什么)
                if (k > 0) {
                    stack.pop();
                    k--;
                    continue;
                }
                sb.append(stack.pop());
            }
            if (sb.length() == 0) return "0";
            return sb.reverse().toString();
        }
    
  • 相关阅读:
    vmwear 及docker
    vue相关
    vue demo
    线程的死锁
    让出和守护线程
    join加入线程
    线程的优先级
    线程间的通信
    synchronized关键字的使用
    线程的并发
  • 原文地址:https://www.cnblogs.com/bears9/p/13515782.html
Copyright © 2011-2022 走看看