#140. 删数问题

删数问题

说明

给定一个 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))) 这种"维护单调栈"的方法比多次扫描字符串更高效。