友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。
公众号的微信号是: 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
不含任何前导零
思路分析
利用单调栈的思路,将前面比当前字符大的字符都删除即可。
利用单调递增栈,将“当前元素”前面更大的元素都删除掉,这样就可以实现尽可能大的减小这个数字。如果数字是递增的,那么就从后面向前删除,直到删够为止。















关于单调栈,记住这两句话:
-
单调递增栈,利用波谷剔除栈中的波峰,留下波谷;
-
单调递减栈,利用波峰剔除栈中的波谷,留下波峰。

-
一刷
-
二刷
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();
}