在字符串操作的面试题或算法题中,经常会遇到“删除一个字符”或“构造最大/最小数字”之类的要求。这类问题不仅考察对字符串的理解能力,还非常依赖对数字大小比较逻辑的敏感度。
今天我们来聊一道看似简单但实际上颇有技巧的字符串处理题:
给你一个表示某个正整数的字符串
number
和一个字符digit
。
请你从number
中 恰好移除一个等于digit
的字符,使得剩下的字符串表示的十进制数最大,并返回这个结果。
输入保证digit
至少在number
中出现一次。
🧠 初步思考:暴力删除是否可行?
最直接想到的办法就是:
“既然要删除一个 digit
,那就遍历字符串,把每个等于 digit
的字符都删一遍,然后对所有结果取一个最大的。”
伪代码:
candidates = []
for i in range(len(number)):
if number[i] == digit:
candidate = number[:i] + number[i+1:]
candidates.append(candidate)
return max(candidates)
这个方法正确但效率不高。如果字符串很长,比如 10^5 级别,每次构造新字符串都会产生较高的开销,不利于时间复杂度优化。
有没有一次遍历就能搞定的办法呢?当然有!
✅ 最优解法:贪心策略
我们可以使用贪心思想:
从左到右寻找一个“合适”的 digit
,当我们发现它后