题目描述:具体描述见原题。简单来说就是按照规则去掉k位数字,使得剩下的数字最小。
解题思路:按照要求,去掉k位数字之后不需要重排,考虑维护一个单调栈。遍历给定字符串,当某个元素入栈前,将栈中大于该数的元素出栈,这样该栈始终是单调递增的,最多有k次出栈。注意当栈底元素为0时,需去掉所有数字0。具体过程见代码。
具体代码:
func removeKdigits(num string, k int) string {
if len(num) <= k { // 去掉所有位数时,直接返回0就可以了
return "0"
}
res := make([]byte, 0)
for _, n := range num {
for k > 0 && len(res) > 0 && byte(n) < res[len(res)-1] { // n入栈之前,将栈中所有大于n的元素出栈,保持栈的单调增特性
res = res[:len(res)-1]
k--
}
res = append(res, byte(n))
}
res = res[:len(res)-k] // 取前 len(res)-k 位作为返回值
for len(res) > 1 && res[0] == '0' { // 去掉所有前缀0
res = res[1:]
}
return string(res)
}
补充说明:其实这个题有点类似维护前K位较大元素,都是使用单调栈,这道题可看作单调栈的基本应用。又到周五了,只想划水。