问题描述
小U手中有两个数字 a 和 b。第一个数字是一个任意的正整数,而第二个数字是一个非负整数。她的任务是将第二个数字 b 插入到第一个数字 a 的某个位置,以形成一个最大的可能数字。
你需要帮助小U找到这个插入位置,输出插入后的最大结果。
测试样例
样例1:
输入:
a = 76543, b = 4
输出:765443
样例2:
输入:
a = 1, b = 0
输出:10
样例3:
输入:
a = 44, b = 5
输出:544
问题理解
题目要求将一个数字插到另一个数字以形成一个最大的可能数字。
解题思路
-
将输入的数字
a转换为字符串aStr。将字符串aStr转换为字符数组aArray,便于逐位处理数字 -
创建一个
StringBuilder对象result,用于构建最终的结果字符串 -
使用变量
inserted来标记是否已经插入了数字b -
如果当前字符
aArray[i]小于b,则将b插入到当前位置,并将inserted标记为true -
如果遍历结束后
b还没有插入,则将b插入到result的末尾 -
将
result转换为字符串,然后转换为整数并返回
代码详解
public static int solution(int a, int b) {
String aStr = String.valueOf(a);
char[] aArray = aStr.toCharArray();
StringBuilder result = new StringBuilder();
// 遍历 aArray,找到合适的位置插入 b
boolean inserted = false;
for (int i = 0; i < aArray.length; i++) {
if (!inserted && aArray[i] - '0' < b) {
result.append(b);
inserted = true;
}
result.append(aArray[i]);
}
// 如果 b 还没有插入,插入到最后
if (!inserted) {
result.append(b);
}
return Integer.parseInt(result.toString());
}
复杂度计算
空间复杂度:O(n),其中 n 是数字 a 的位数。
时间复杂度:O(n),其中 n 是数字 a 的位数。
知识点总结
-
字符串转换和遍历
-
条件判断
-
StringBuilder的使用:StringBuilder result = new StringBuilder();``result.append(b);和result.append(aArray[i]);:在StringBuilder中追加字符或数字。 -
使用布尔变量
inserted标记是否已经插入了数字b,当已被标记说明当前数字已经是最大的了,不用再继续后面的遍历,直接跳出循环,避免重复插入。
其他方法
- 二分查找
- 将数字
a转换为字符串。 - 使用二分查找找到插入位置,使得插入后的数字最大。
时间复杂度:O(n log n),其中 n 是数字 a 的位数。
空间复杂度:O(n),用于存储字符串和结果。
- 双指针:
- 将数字
a转换为字符串。 - 使用双指针找到插入位置,使得插入后的数字最大。
时间复杂度:O(n),其中 n 是数字 a 的位数。
空间复杂度:O(n),用于存储字符串和结果。
- 递归:
- 将数字
a转换为字符串。 - 使用递归找到插入位置,使得插入后的数字最大。
时间复杂度:O(n),其中 n 是数字 a 的位数。
空间复杂度:O(n),用于存储字符串和结果。
作者:Hewson
链接:juejin.cn/post/744230…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。