问题分析与核心思路👍
你提到的是一个经典的字符串拼接问题,目标是将一个数字插入到原数字字符串的最优位置,使得结果尽可能大。这个问题的关键在于找到插入位置的贪心策略。
🧩 算法思路
贪心策略:我们需要找到第一个小于待插入数字d的位置,将d插入到该位置之前。如果所有数字都大于等于d,则将d插入到末尾。
特殊情况:如果d是0,我们需要将其插入到第一个非零数字之前,以避免前导零。
关键观察
对于数字字符串s和待插入数字d:
当d > s[i]时,插入到i位置可以得到更大的数字
当d == s[i]时,需要继续向后寻找,因为后续可能有更小的数字
当d < s[i]时,继续向后寻找
📝 代码实现(C++)
📌 代码解释
输入处理:
使用ios::sync_with_stdio(false);和cin.tie(nullptr);提高输入输出速度
读取测试用例数量t
对于每个测试用例,读取n(数字长度)、d(待插入数字)和数字字符串s
寻找插入位置:
将数字d转换为字符dc
初始化pos为n,表示默认插入到末尾
遍历字符串s,找到第一个小于d的字符位置pos
插入数字并输出结果:
使用string::insert函数在pos位置插入dc
输出结果字符串
🧪 测试样例验证
对于题目中的样例:
输入:
1
10 4
7654376543
处理过程:
d=4,转换为字符'4'
遍历字符串"7654376543":
s[0]='7' > 4,继续
s[1]='6' > 4,继续
s[2]='5' > 4,继续
s[3]='4' == 4,继续
s[4]='3' < 4,找到pos=4
在位置4插入'4',得到结果"76544376543"
这与题目中的示例输出一致。
📊 复杂度分析
时间复杂度:O(n),每个测试用例需要遍历字符串一次
空间复杂度:O(n),需要存储字符串和结果
🎯 优化点
输入输出优化:使用ios::sync_with_stdio(false);和cin.tie(nullptr);提高速度
直接比较数字大小,避免字符转换带来的开销
提前终止循环,找到第一个插入位置后立即停止遍历