题目简介:
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
- num 的长度小于 10002 且 ≥ k。
- num 不会包含任何前导零。
示例 1 :
1 | 输入: num = "1432219", k = 3 |
示例 2 :
1 | 输入: num = "10200", k = 1 |
示例 3 :
1 | 输入: num = "10", k = 2 |
思路:
由于移除数字后需要得到尽可能小的数字,所以在最前面的数字越小越好。
我们可以先用移除一位数字作为例子,如253
,当num[2] = 3 < num[1] = 5
时,我们便可以将5
删除,留下的便是最小的数字23
。
换句话说,也就是当num[i] < num[i - 1]
时,我们便可以将num[i - 1]
删除,否则排在前面的便是num[i]
,整体就变大了。
那么问题转化为移除k
位数字时,做法也是一样的,这时我们需要利用栈。
当前元素小于栈顶元素时,即num[i] < num[i - 1]
时,我们便可以弹出栈顶元素,相当于删除了一个数字(前提是栈非空且k > 0
)。
遍历完字符串后,若k > 0
,则我们需要比较k
与字符串res
的长度:
k >= res.size()
,说明所有数字都需要被删除,则res = "0"
。k < res.size()
,则将字符串最前面的元素删除,也就是将栈顶元素删除(栈顶元素为最大数字)。
最后将字符串翻转,并去除前导0即可。
tip:
- 入栈时需要将所有字符都入栈。
代码如下:
1 | class Solution { |