一、问题描述
小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. 考虑不同情况 (1)当 b大于a 的最高位数字时
(2)当 b小于a 的最高位数字时
(3)当a 只有一位数字时,直接将b 放在a 的后面即可得到最大结果
(4)当 b为 0且 的最高位不为0 时,将 b插入到 a的最前面得到的数字会比插入到其他位置小(因为 0在前面会使数字变小
实现代码(Java)
public class Main { public static int solution(int a, int b) { String num1 = String.valueOf(a); String num2 = String.valueOf(b); long max = Long.MIN_VALUE; for (int i = 0; i <= num1.length(); i++) { String newNum = num1.substring(0, i) + num2 + num1.substring(i); long current = Long.parseLong(newNum); if (current > max) { max = current; } } return (int) max; } public static void main(String[] args) { 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); }}
代码解释如下:
insertToMaximize方法: 首先,将输入的整数 a 和 b 分别转换为字符串 numA 和 numB,这样便于在数字 a 的不同位置插入数字 b。 然后,初始化一个变量 maxValue 为 Integer.MIN_VALUE,用于存储在遍历过程中找到的最大结果。 接下来,通过一个循环遍历数字 a 的每一个可能插入位置。循环从索引 0 开始,到 numA.length() 结束(包括在末尾插入的情况)。
在每次循环中: 构建一个新的字符串 newNum,它是通过将数字 a 在索引 i 处分割成两部分,然后在中间插入数字 b 得到的。 将新构建的字符串 newNum 转换回整数 currentValue。 如果 currentValue 大于当前的 maxValue,就更新 maxValue 为 currentValue。
最后,返回 maxValue,即插入数字 b 后能得到的最大整数。 main方法: 创建一个 Scanner 对象用于从控制台读取用户输入。 提示用户输入正整数 a 和非负整数 b,并分别读取它们的值。 调用 insertToMaximize 方法计算插入后的最大结果,并将结果输出到控制台。 最后,关闭 Scanner 对象以释放相关资源。
通过以上代码,就可以根据用户输入的正整数 a 和非负整数 b,找到将 b 插入到 a 中能得到的最大整数并输出。
学习心得:
通过解决这类问题可以加深对数字处理和字符串操作的理解。在实际编程中,经常会遇到需要对数字进行各种变换和组合的情况,将数字转换为字符串来处理可以更方便地实现一些复杂的逻辑,比如本题中在不同位置插入数字的操作。同时,通过不断比较和更新最大值的过程,也能进一步熟悉循环和条件判断的运用,提升逻辑思维和编程能力。