小U的数字插入问题

102 阅读2分钟

题目要求实现一个名为 solution 的方法,该方法接收两个整数 ab,并将整数 b 插入到整数 a 的适当位置,使得结果仍然是一个整数,并且结果是最小的。以下是解题对该问题的描述和代码分析:

解题思路

  1. 字符串转换:将整数 ab 转换成字符串,以方便逐位比较。
  2. 插入位置查找:通过两层循环,逐位比较 ab 的所有字符,找到一个合适的位置将 b 插入到 a 中,以保持结果最小。
  3. 条件判断
    • 当发现 b 的某一位比 a 的当前位小时,可能的插入位置是当前位的前面。
    • 当遍历完成后如果 b 的所有位都比 a 的左侧位大,那么可以将 b 直接追加至 a 的后面。
  4. 构造结果:在找到合适的插入位置后,构造新的字符串并将其转换为整数返回。

代码实现

以下是代码解析和实现:

public class Main {
    public static int solution(int a, int b) {
        // 将整数转换为字符串
        String s = String.valueOf(a);
        String c = String.valueOf(b);
        StringBuffer s1 = new StringBuffer(s); // 用于构建结果字符串
        
        int temp = 0; // 用于记录插入位置
        int flag = 0; // 用于指示是否需要提前终止遍历

        // 遍历每一位数字
        for (int i = 0; i < s.length(); i++) {
            for (int j = 0; j < c.length(); j++) {
                if (i + j >= s.length()) {
                    break; // 防止越界
                }
                // 比较字符
                if (s.charAt(i + j) == c.charAt(j)) {
                    temp = i + j; // 相等时更新插入位置
                }
                if (s.charAt(i + j) > c.charAt(j)) {
                    temp = i + j;  // 找到小于时,更新插入位置
                    break; // 可以停止内层循环
                }
                if (s.charAt(i + j) < c.charAt(j)) {
                    flag = 1; // 标记需要提前退出外层循环
                    break; 
                }
            }
            if (flag == 1) {
                break; // 外层循环退出
            }
        }
        
        // 如果 `b` 的所有位都比 `a` 的左侧位大,直接追加
        if (flag == 0 && temp == s.length() - 1) {
            return Integer.valueOf(s1.append(c).toString());
        }
        
        // 在找到的位置插入 `c`
        s1.insert(temp + 1, c); // 插入后,`temp + 1`
        return Integer.valueOf(s1.toString()); // 返回结果
    }

    public static void main(String[] args) {
        System.out.println(solution(17, 1)); // 输出预期结果
        // 其他测试用例
        // System.out.println(solution(76543, 4) == 765443);
        // System.out.println(solution(1, 0) == 10);
        // System.out.println(solution(44, 5) == 544);
        // System.out.println(solution(666, 6) == 6666);
    }
}

代码分析

  1. 我们首先将两个整数转换为字符串以便于比对。
  2. 通过双重循环比较字符,一旦找到插入条件,就改变插入位置或跳出循环。
  3. 如果已经遍历完所有 a 的字符但未找到适合的位置,最终将 b 追加至 a 的后面。
  4. 使用 StringBuffer 可以避免在字符串中频繁创建新的实例,因此效率更高。

注意事项

  • 代码中已经加入了越界检查(if (i + j >= s.length()) { break; }),保证了安全性。
  • 方法 StringBuffer.insert 用于在指定位置插入字符串,最后输出转换为整数的结果。