小U的数字插入问题 | 豆包MarsCode AI刷题

33 阅读4分钟

问题描述

小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。

你需要帮助小U找到这个插入位置,输出插入后的最大结果。

测试样例

样例1:

输入:a = 76543, b = 4
输出:765443

样例2:

输入:a = 1, b = 0
输出:10

样例3:

输入:a = 44, b = 5
输出:544

样例4:

输入:a = 666, b = 6
输出:6666

解题步骤

  1. 将数字转换为字符串:因为我们需要在数字的任意位置插入另一个数字,所以将数字转换为字符串会更方便进行插入操作。
  2. 比较和插入:我们需要找到合适的位置,将字符串 b 插入到字符串 a 中,使得最终形成的数字是最大的。为此,我们可以从左到右遍历字符串 a,并在每个可能的位置尝试插入字符串 b
  3. 比较结果:在每次尝试插入后,我们需要比较得到的新数字与之前保存的最大数字,以确定是否需要更新最大数字。

解决思路

  • 将整数 a 和 b 转换为字符串 strA 和 strB

  • 初始化一个变量 maxNumber 来保存当前找到的最大数字,初始值可以是 strA

  • 遍历 strA,对于每个位置 i

    • 将 strB 插入到 strA 的位置 i,得到新的字符串 newNumber
    • 将 newNumber 转换为整数,并与 maxNumber 进行比较。
    • 如果 newNumber 大于 maxNumber,则更新 maxNumber
  • 在遍历结束后,maxNumber 将是插入 b 后得到的最大数字。

相关代码

#include <string>
#include <algorithm>

using namespace std;

int solution(int a, int b) {
    // 将数字转换为字符串
    string s = to_string(a);
    string c = to_string(b);
    
    // 使用string来代替StringBuffer
    string s1 = s;
    
    int i = 0;
    int j = 0;
    int temp = 0;
    int flag = 0;
    
    for(i = 0; i < s.length(); i++) {
        for(j = 0; j < c.length(); j++) {
            if(s[i + j] == c[j]) {
                temp = i + j;
            }
            if(s[i + j] > c[j]) {
                temp = i + j + 1;
                break;
            }
            if(s[i + j] < c[j]) {
                flag = 1;
                break;
            }
        }
        if(flag == 1) {
            break;
        }
    }
    
    if(i == s.length()) {
        s1.append(c);
        return stoi(s1);
    }
    
    s1.insert(temp, c);
    return stoi(s1);
}

int main() {
    cout << solution(17, 1) << endl;
    // cout << (solution(76543, 4) == 765443) << endl;
    // cout << (solution(1, 0) == 10) << endl;
    // cout << (solution(44, 5) == 544) << endl;
    // cout << (solution(666, 6) == 6666) << endl;
    return 0;
}

知识总结:

1.字符串操作与数字转换:在处理数字插入问题时,我学会了如何将数字转换为字符串,并在特定位置进行插入操作,然后再转换回数字。这种技巧在处理需要按位操作的数学问题时非常有用。
2.字典序比较:通过比较字符串的字典序,我理解了如何在不转换为数字的情况下确定两个数字的大小关系,这对于解决某些特定的算法问题非常有帮助。
3.迭代与比较:在寻找最佳插入位置时,我使用了迭代和比较的方法,这种方法教会了我如何系统地测试所有可能的情况,以找到最优解。

对于其他入门同学,我的建议是:

  1. 基础要扎实:在开始刷题之前,确保你掌握了编程语言的基础知识,包括数据类型、控制结构、函数等。
  2. 逐步提高难度:从简单的题目开始,逐步过渡到更复杂的题目,这样可以建立信心并逐步掌握解题技巧。
  3. 理解而非记忆:尝试理解问题的本质和解题的原理,而不是简单地记忆代码。

学习计划:

  1. 制定刷题计划:每天至少刷两道题目,一道是巩固已掌握知识点的题目,另一道是尝试解决新知识点或更难问题的题目。
  2. 利用错题本:将错题记录下来,并定期回顾,分析错误原因,确保不重复相同的错误。
  3. 定期复习:每周至少花一天时间复习本周学到的知识点和解题方法,加深记忆和理解。

工具运用:

为了达到更好的学习效果,我将AI刷题功能与其他学习资源相结合:

  1. 结合在线教程:在刷题遇到困难时,我会查阅相关的在线教程或文档,以加深对知识点的理解。
  2. 参与讨论社区:在刷题社区中,我会与其他刷题者交流解题思路,这有助于开阔视野并学习不同的解题方法。
  3. 利用AI反馈:AI刷题工具提供的即时反馈帮助我快速识别错误,并根据建议进行改进。