leetcode-402

214 阅读1分钟

题目描述:具体描述见原题。简单来说就是按照规则去掉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位较大元素,都是使用单调栈,这道题可看作单调栈的基本应用。又到周五了,只想划水。