这是一篇刷题笔记
小U的数字插入问题
问题描述
小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
思路如下:
一、整体分析
我们的目标是将非负整数 b 插入到正整数 a 的某个位置,使得形成的新数字最大。为了达到这个目标,我们需要比较 b 插入在 a 的不同位置时所得到的各种可能结果,然后找出其中最大的那个。
二、将数字转换为字符串处理
由于直接对数字进行插入操作比较复杂,且难以比较不同插入位置形成的结果大小,所以我们先将数字 a 和 b 都转换为字符串形式。这样一来,我们就可以通过字符串的拼接和比较操作来模拟数字的插入过程并比较结果。
三、确定插入位置的遍历范围
因为要将 b 插入到 a 的某个位置,所以我们需要遍历 a 的所有可能插入位置。对于字符串形式的 a,其长度为 n(假设 a 转换后的字符串长度为 n),那么 b 可以插入的位置就有 n + 1 个,从 a 的最左边(即索引为 0 的位置)开始,一直到 a 的最右边(即索引为 n 的位置)。
四、模拟插入操作并比较结果
对于每一个可能的插入位置 i(0 <= i <= n):
-
我们先将字符串
a拆分成两部分:- 第一部分是从
a的开头到插入位置i的子字符串,记为left_str。 - 第二部分是从插入位置
i到a的结尾的子字符串,记为right_str。
- 第一部分是从
-
然后我们通过字符串拼接操作,将
b插入到这两部分之间,形成一个新的字符串new_str,拼接方式为new_str = left_str + str(b) + right_str(这里str(b)是将数字b转换后的字符串形式)。 -
接下来,我们需要比较这个新字符串
new_str和之前已经得到的最大结果字符串(初始时可以设为一个非常小的字符串,比如空字符串或者一个极小值对应的字符串形式,方便后续比较更新)。- 如果
new_str所表示的数字大于之前的最大结果字符串所表示的数字(这里可以通过将字符串再转换回数字进行比较,或者利用字符串比较函数,根据字典序比较,在这种情况下,由于我们是按照形成最大数字的要求来操作的,所以字典序大的字符串通常也对应着更大的数字),那么我们就更新最大结果字符串为new_str。
- 如果
代码
public class Main {
public static int solution(int a, int b) {
String A = Integer.toString(a);
String B = Integer.toString(b);
int max = 0;
for(int i = 0;i<= A.length();i++){
String nw = A.substring(0,i)+B+A.substring(i);
if(max < Integer.parseInt(nw)){
max = Integer.parseInt(nw);
}
}
System.out.print(max);
return 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);
}
}