栈-N402-移掉K位数字

题目

  • 概述:给定一个自然数字符串,要求从中移掉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 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位数字)