LeetCode 402. 移掉 K 位数字

题目描述

402. 移掉 K 位数字

image-20241103153952322

思路分析

单调递增栈

image-20250510121704615

参考代码

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
32
33
func removeKdigits(num string, k int) string {
    var stack []byte

    for i := 0; i < len(num); i++ {
        // 当栈不为空,且当前数字小于栈顶数字,并且还有可以移除的数字
        for k > 0 && len(stack) > 0 && stack[len(stack)-1] > num[i] {
            stack = stack[:len(stack)-1] // 弹出栈顶元素
            k--
        }
        stack = append(stack, num[i]) // 将当前数字推入栈中
    }

    // 如果还有剩余的 k,移除栈末尾的元素
    for k > 0 {
        stack = stack[:len(stack)-1]
        k--
    }

    // 将栈中的数字拼接成字符串
    res := string(stack)

    // 去掉前导零
    for len(res) > 0 && res[0] == '0' {
        res = res[1:]
    }

    // 如果结果为空,返回 "0"
    if res == "" {
        return "0"
    }

    return res
}
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
func removeKdigits(num string, k int) string {
	var stack []byte
	for i := 0; i < len(num); i++ {
		// 若当前数字比栈顶数字小,移除栈顶元素
		for k > 0 && len(stack) > 0 && stack[len(stack)-1] > num[i] {
			stack = stack[:len(stack)-1]
			k--
		}
		stack = append(stack, num[i])
	}

	// 如果还有需要移除的数字
	for k > 0 {
		stack = stack[:len(stack)-1]
		k--
	}

	// 移除前导零
	res := string(stack)
	i := 0
	for i < len(res) && res[i] == '0' {
		i++
	}
	res = res[i:]

	if len(res) <= 0 {
		return "0"
	}

	return res
}

➡️ 点击查看 Java 题解

1
write your code here

image-20250510121526608

本文作者:
本文链接: https://hgnulb.github.io/blog/2025/70730153
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!