美文网首页
栈-N402-移掉K位数字

栈-N402-移掉K位数字

作者: 三次元蚂蚁 | 来源:发表于2019-04-17 20:54 被阅读0次

    题目

    • 概述:给定一个自然数字符串,要求从中移掉K个数,使得剩下的字符所组成的自然数最小

    • 输入:自然数字符串,长度范围[k, 10002]

      输入自然数字符串不包含前导零

    • 输出:剩下的字符所组成的自然数字符串

      输出不能包含前导零
      若最后没有剩下任何字符,则返回“0”

    • 出处:https://leetcode-cn.com/problems/remove-k-digits/

    思路

    • 由于需要暂存之前的数字跟后面的数字比较判断是否移掉该数字,所以考虑用栈实现

    • 如果自然数字符串的长度等于k,则返回“0”

    • 遍历剩余字符串直至剩余字符串为空或移掉的字符个数等于k:

      1. 栈为空 => 当前数字入栈
      2. 当前数字 >= 栈顶数字 => 当前数字入栈
      3. 当前数字 < 栈顶数字 => 栈顶数字出栈,移掉字符个数+1,循环
    • 若移掉的字符个数 < k => 将栈出栈(k - 移掉的字符个数)次

    • 将栈中元素逆序与剩余字符串拼接,消去前导0,若最后为空串则返回“0”,否则直接返回

    代码

    class Solution {
        public String removeKdigits(String num, int k) {
            if (num.length() == k) {
                return "0";
            }
            
            LinkedList<Character> stack = new LinkedList<>();
            int i = 0;
            while (i < num.length() && k > 0) {
                if (stack.isEmpty() || stack.peek() - num.charAt(i) <= 0) {
                    stack.push(num.charAt(i++));
                } else {
                    stack.pop();
                    --k;
                }
            }
            
            while (k > 0) {
                stack.pop();
                --k;
            }
            
            StringBuilder sb = new StringBuilder(num.substring(i));
            while (!stack.isEmpty()) {
                sb.insert(0, stack.pop());
            }
            
            String result = sb.toString();
            int s = 0;
            while (s < result.length() && '0' == result.charAt(s)) {
                ++s;
            }
            
            if (s == result.length()) {
                return "0";
            } else {
                return result.substring(s);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:栈-N402-移掉K位数字

          本文链接:https://www.haomeiwen.com/subject/yfpowqtx.html