402.移掉 K 位数字

95 阅读1分钟

题目:
给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k **位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
算法:
如果a < b则123a456 < 123b456 。因此可以遍历num,将遍历的数据保存到stack中,遍历比较nums[i]和stack 栈顶元素的大小,决定是否出栈,

func removeKdigits(num string, k int) string {
	stack := make([]byte, 0)
	for i := range num {
		// stack末尾元素小于num[i],丢弃stack的末尾元素
		for k > 0 && len(stack) > 0 && stack[len(stack) - 1] > num[i] {	
			stack = stack[:len(stack) - 1]
			k --
		}
		stack = append(stack, num[i])
	}
	stack = stack[:len(stack) - k]
	// 去除前导0
	start := 0
	for start < len(stack) {
		if stack[start] != '0' {
			break
		}
		start ++
	}
	stack = stack[start:]
	if len(stack) == 0 {
		return "0"
	}
	return string(stack)
}