Skip to content

Commit d6cdf86

Browse files
committed
二刷402
1 parent b2cedec commit d6cdf86

File tree

6 files changed

+89
-39
lines changed

6 files changed

+89
-39
lines changed

docs/0000-10-monotonic-stack.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ for (int i = 1; i < nums.length; i++) {
4848
* 单调递增栈,利用波谷剔除栈中的波峰,留下波谷;
4949
* 单调递减栈,利用波峰剔除栈中的波谷,留下波峰。
5050

51+
image::images/0402-16.png[{image_attr}]
52+
5153

5254
== 经典题目
5355

docs/0316-remove-duplicate-letters.adoc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ https://leetcode.cn/problems/remove-duplicate-letters/[LeetCode - 316. 去除重
3030

3131
注意,在遍历字符时,向前走一步,则当前字符的次数就要减一。
3232

33+
关于单调栈,记住这两句话:
34+
35+
* 单调递增栈,利用波谷剔除栈中的波峰,留下波谷;
36+
* 单调递减栈,利用波峰剔除栈中的波谷,留下波峰。
37+
38+
image::images/0402-16.png[{image_attr}]
39+
3340
[[src-0316]]
3441
[tabs]
3542
====

docs/0402-remove-k-digits.adoc

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,47 @@
11
[#0402-remove-k-digits]
2-
= 402. Remove K Digits
2+
= 402. 移掉 K 位数字
33

4-
{leetcode}/problems/remove-k-digits/[LeetCode - Remove K Digits^]
4+
https://leetcode.cn/problems/remove-k-digits/[LeetCode - 402. 移掉 K 位数字^]
55

6-
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.
6+
给你一个以字符串表示的非负整数 `num` 和一个整数 `k`,移除这个数中的 `k` 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
77

8-
*Note:*
8+
*示例 1 :*
99

10-
* The length of _num_ is less than 10002 and will be ≥ _k_.
11-
* The given _num_ does not contain any leading zero.
10+
....
11+
输入:num = "1432219", k = 3
12+
输出:"1219"
13+
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。
14+
....
1215

13-
*Example 1:*
16+
*示例 2 :*
1417

15-
[subs="verbatim,quotes,macros"]
16-
----
17-
Input: num = "1432219", k = 3
18-
Output: "1219"
19-
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.
20-
----
18+
....
19+
输入:num = "10200", k = 1
20+
输出:"200"
21+
解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
22+
....
2123

22-
*Example 2:*
24+
*示例 3 :*
2325

24-
[subs="verbatim,quotes,macros"]
25-
----
26-
Input: num = "10200", k = 1
27-
Output: "200"
28-
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.
29-
----
26+
....
27+
输入:num = "10", k = 2
28+
输出:"0"
29+
解释:从原数字移除所有的数字,剩余为空就是 0 。
30+
....
3031

31-
*Example 3:*
32+
*提示:*
33+
34+
* `1 \<= k \<= num.length \<= 10^5^`
35+
* `num` 仅由若干位数字(0 - 9)组成
36+
* 除了 *0* 本身之外,`num` 不含任何前导零
3237
33-
[subs="verbatim,quotes,macros"]
34-
----
35-
Input: num = "10", k = 2
36-
Output: "0"
37-
Explanation: Remove all the digits from the number and it is left with nothing which is 0.
38-
----
3938
4039
== 思路分析
4140

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

43+
利用单调递增栈,将“当前元素”前面更大的元素都删除掉,这样就可以实现尽可能大的减小这个数字。如果数字是递增的,那么就从后面向前删除,直到删够为止。
44+
4445
image::images/0402-01.png[{image_attr}]
4546

4647
image::images/0402-02.png[{image_attr}]
@@ -71,6 +72,13 @@ image::images/0402-14.png[{image_attr}]
7172

7273
image::images/0402-15.png[{image_attr}]
7374

75+
关于单调栈,记住这两句话:
76+
77+
* 单调递增栈,利用波谷剔除栈中的波峰,留下波谷;
78+
* 单调递减栈,利用波峰剔除栈中的波谷,留下波峰。
79+
80+
image::images/0402-16.png[{image_attr}]
81+
7482
[[src-0402]]
7583
[tabs]
7684
====
@@ -83,22 +91,19 @@ include::{sourcedir}/_0402_RemoveKDigits.java[tag=answer]
8391
----
8492
--
8593
86-
// 二刷::
87-
// +
88-
// --
89-
// [{java_src_attr}]
90-
// ----
91-
// include::{sourcedir}/_0402_RemoveKDigits_2.java[tag=answer]
92-
// ----
93-
// --
94+
二刷::
95+
+
96+
--
97+
[{java_src_attr}]
98+
----
99+
include::{sourcedir}/_0402_RemoveKDigits_2.java[tag=answer]
100+
----
101+
--
94102
====
95103

104+
96105
== 参考资料
97106

98107
. https://leetcode.cn/problems/remove-k-digits/solutions/484940/yi-diao-kwei-shu-zi-by-leetcode-solution/[402. 移掉 K 位数字 - 官方题解^]
99108
. https://leetcode.cn/problems/remove-k-digits/solutions/290203/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-5/[402. 移掉 K 位数字 - 一招吃遍力扣四道题^]
100109
. https://leetcode.cn/problems/remove-k-digits/solutions/485036/wei-tu-jie-dan-diao-zhan-dai-ma-jing-jian-402-yi-d/[402. 移掉 K 位数字 - 「手画图解」单调递增栈,为什么?何时用?^]
101-
102-
103-
104-

docs/images/0402-16.png

126 KB
Loading

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,11 @@ endif::[]
15141514
|{doc_base_url}/0316-remove-duplicate-letters.adoc[题解]
15151515
|❌ 复习 {doc_base_url}/0000-10-monotonic-stack.adoc[Monotonic Stack 单调栈]。知道是单调栈,代码还是没写出来!看到题解,又里面秒懂。
15161516

1517+
|{counter:codes2503}
1518+
|{leetcode_base_url}/remove-k-digits/[402. 移掉 K 位数字^]
1519+
|{doc_base_url}/0402-remove-k-digits.adoc[题解]
1520+
|⭕️ 单调栈。利用单调递增栈,将“当前元素”前面更大的元素都删除掉,这样就可以实现尽可能大的减小这个数字。如果数字是递增的,那么就从后面向前删除,直到删够为止。
1521+
15171522
|===
15181523

15191524
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0402_RemoveKDigits_2 {
4+
// tag::answer[]
5+
/**
6+
* @author D瓜哥 · https://www.diguage.com
7+
* @since 2025-09-11 21:45:14
8+
*/
9+
public String removeKdigits(String num, int k) {
10+
StringBuilder stack = new StringBuilder();
11+
char[] chars = num.toCharArray();
12+
stack.append(chars[0]);
13+
for (int i = 1; i < chars.length; i++) {
14+
char c = chars[i];
15+
while (k > 0 && !stack.isEmpty()
16+
&& stack.charAt(stack.length() - 1) > c) {
17+
stack.deleteCharAt(stack.length() - 1);
18+
k--;
19+
}
20+
if (c == '0' && stack.isEmpty()) {
21+
continue;
22+
}
23+
stack.append(c);
24+
}
25+
for (int i = 0; i < k && !stack.isEmpty(); i++) {
26+
stack.deleteCharAt(stack.length() - 1);
27+
}
28+
return stack.isEmpty() ? "0" : stack.toString();
29+
}
30+
// end::answer[]
31+
}

0 commit comments

Comments
 (0)