友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

402. 移掉 K 位数字

给你一个以字符串表示的非负整数 num 和一个整数 k,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

示例 1 :

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。

示例 2 :

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0 。

提示:

  • 1 <= k <= num.length <= 105

  • num 仅由若干位数字(0 - 9)组成

  • 除了 0 本身之外,num 不含任何前导零

思路分析

利用单调栈的思路,将前面比当前字符大的字符都删除即可。

利用单调递增栈,将“当前元素”前面更大的元素都删除掉,这样就可以实现尽可能大的减小这个数字。如果数字是递增的,那么就从后面向前删除,直到删够为止。

0402 01
0402 02
0402 03
0402 04
0402 05
0402 06
0402 07
0402 08
0402 09
0402 10
0402 11
0402 12
0402 13
0402 14
0402 15

关于单调栈,记住这两句话:

  • 单调递增栈,利用波谷剔除栈中的波峰,留下波谷;

  • 单调递减栈,利用波峰剔除栈中的波谷,留下波峰。

0402 16
  • 一刷

  • 二刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2024-08-16 19:48:26
 */
public String removeKdigits(String num, int k) {
  if (num == null || num.isEmpty()) {
    return num;
  }
  if (num.length() <= k) {
    return "0";
  }
  char[] chars = num.toCharArray();
  StringBuilder stack = new StringBuilder();
  stack.append(chars[0]);
  for (int i = 1; i < chars.length; i++) {
    char c = chars[i];
    while (!stack.isEmpty() && stack.charAt(stack.length() - 1) > c && k > 0) {
      stack.deleteCharAt(stack.length() - 1);
      k--;
    }
    stack.append(c);
  }
  for (int i = k; i > 0; i--) {
    stack.deleteCharAt(stack.length() - 1);
  }
  while (!stack.isEmpty() && stack.charAt(0) == '0') {
    stack.deleteCharAt(0);
  }
  return stack.isEmpty() ? "0" : stack.toString();
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-09-11 21:45:14
 */
public String removeKdigits(String num, int k) {
  StringBuilder stack = new StringBuilder();
  char[] chars = num.toCharArray();
  stack.append(chars[0]);
  for (int i = 1; i < chars.length; i++) {
    char c = chars[i];
    while (k > 0 && !stack.isEmpty()
      && stack.charAt(stack.length() - 1) > c) {
      stack.deleteCharAt(stack.length() - 1);
      k--;
    }
    if (c == '0' && stack.isEmpty()) {
      continue;
    }
    stack.append(c);
  }
  for (int i = 0; i < k && !stack.isEmpty(); i++) {
    stack.deleteCharAt(stack.length() - 1);
  }
  return stack.isEmpty() ? "0" : stack.toString();
}