说明
给定一个 n 位正整数 s(不含前导零),从中删除 k 位数字,使得剩下的数字按原顺序组成的数**最小**。
例如:s = 178543, k = 4,删除 4 位后剩下 2 位。可能的结果有 17, 18, 15, 14, 13, 78, 75, 74, 73, \dots 其中最小的两位数是 13。
输入格式
第一行,一个正整数 s(不含前导零,1 \le \text{len}(s) \le 10^5)。
第二行,一个整数 k(1 \le k < \text{len}(s))。
输出格式
一行,删除 k 位后得到的最小数。
**注意**:如果结果有前导零,保留一个零即可(如 001 \to 1,000 \to 0)。
178543
4
13
提示
贪心策略:从左到右找第一个"高峰"(即 s[i] > s[i+1]),删除 s[i]。重复 k 次。
实现时可以用列表/栈,高效做法:
s = list(map(int, s_str)) # 转成数字列表
result = []
for digit in s:
while k > 0 and result and result[-1] > digit:
result.pop()
k -= 1
result.append(digit)
# 如果 k 还有剩余,从末尾删
result = result[:len(result)-k] if k > 0 else result
# 去除前导零
while len(result) > 1 and result[0] == 0:
result.pop(0)
print(''.join(map(str, result)))
这种"维护单调栈"的方法比多次扫描字符串更高效。