Leecode 0402. 移掉 K 位数字
402. 移掉 K 位数字
给你一个以字符串表示的非负整数 num
和一个整数 k
,移除这个数中的 k
位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 1 :
1 | 输入:num = "1432219", k = 3 |
示例 2 :
1 | 输入:num = "10200", k = 1 |
示例 3 :
1 | 输入:num = "10", k = 2 |
解题思路
核心思路是单调栈 + 贪心算法,通过维护一个递增的栈来确保剩余数字最小,同时控制移除的数字数量不超过 k
:
- 单调栈逻辑:
- 遍历字符串中的每个数字,对于当前数字
c
:- 若栈不为空,且栈顶数字大于
c
,且仍有可移除的次数(k > 0
),则弹出栈顶数字(移除该数字可使结果更小),同时k--
; - 将当前数字
c
压入栈。
- 若栈不为空,且栈顶数字大于
- 遍历字符串中的每个数字,对于当前数字
- 处理剩余可移除次数:
- 若遍历结束后
k
仍大于 0(说明剩余数字是递增的),则从栈尾移除k
个数字。
- 若遍历结束后
- 清理前导零和空字符串:
- 移除栈中开头的所有 '0'(避免前导零);
- 若栈为空,返回 "0",否则返回栈中字符组成的字符串。
代码实现
1 | #include <string> |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.