LeetCode 402. 移掉 K 位数字

题目描述

🔥 402. 移掉 K 位数字

image-20241103153952322

思路分析

为了使剩下的数字最小,我们可以使用一个栈来解决这个问题。具体步骤如下:

  1. 初始化一个空栈,用于存储最终结果的数字。
  2. 遍历字符串 num 中的每一个字符 digit
  3. 在遍历过程中,如果栈不为空且栈顶元素大于当前字符 digit,并且 k 大于 0,则弹出栈顶元素,并将 k 减 1。
  4. 将当前字符 digit 压入栈中。
  5. 如果遍历结束后 k 仍然大于 0,则从栈顶开始弹出 k 个元素。
  6. 最后,将栈中的元素拼接成字符串,并去掉前导零。

参考代码

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++ {
		digit := num[i]
		for len(stack) > 0 && k > 0 && stack[len(stack)-1] > digit {
			stack = stack[:len(stack)-1]
			k--
		}
		stack = append(stack, digit)
	}

	// 如果 k 仍然大于 0,继续从栈顶弹出元素
	stack = stack[:len(stack)-k]

	// 去掉前导零
	res := ""
	leadingZero := true
	for _, digit := range stack {
		if leadingZero && digit == '0' {
			continue
		}
		leadingZero = false
		res += string(digit)
	}

	if res == "" {
		return "0"
	}
	return res
}
  • 时间复杂度:O (n),其中 n 是字符串 num 的长度。每个字符最多被压入和弹出栈一次。
  • 空间复杂度:O (n),用于存储栈的空间。
1
write your code here

🍏 点击查看 Java 题解

1
write your code here

相似题目

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