402.Remove-K-Digits

402. Remove K Digits

题目地址

https://leetcode.com/problems/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.

代码

Approach #1 Greedy with Stack

class Solution {
  public String removeKdigits(String num, int k) {
        LinkedList<Character> stack = new LinkedList<Character>();

    for (char digit: num.toCharArray()) {
      // 单调递增栈
      while (stack.size() > 0 && k > 0 && stack.peekLast() > digit) {
        stack.removeLast();
        k -= 1;
      }
      stack.addLast(digit);
    }

    for (int i = 0; i < k; i++) {
      stack.removeLast();
    }

    StringBuilder ret = new StringBuilder();
    boolean leadingZero = true;
    for (char digit: stack) {
      if (leadingZero && digit == '0') continue;
      leadingZero = false;
      ret.append(digit);
    }

    if (ret.length() == 0)    return "0";
    return ret.toString();
  }
}

Last updated