问题描述
小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、将 a 和 b 转换为字符串:
这样可以方便地逐位比较和插入。
2、遍历 a 的每个字符:
对于 a 的每个字符,检查 b 的每个字符是否可以插入到当前位置,使得生成的新整数更大。
3、插入 b:
如果找到一个位置,使得 b 的当前字符大于 a 的当前字符,则将 b 插入到该位置。
如果遍历完所有字符都没有找到合适的插入位置,则将 b 插入到 a 的末尾。
复杂度分析
- 时间复杂度:O(n×t)
- 空间复杂度:O(n+t)
其中,n 是 a 的位数,t **是 b 的位数。
代码实现
Java 代码实现
public class Main {
public static int solution(int a, int b) {
// 将 a 转换为字符串
String aStr = String.valueOf(a);
int n = aStr.length();
// 将 b 转换为字符串
String bStr = Integer.toString(b);
int t = bStr.length();
// 遍历字符串 a
for (int i = 0; i < n; i++) {
// 遍历字符串 b
for (int j = 0; j < t; j++) {
// 检查是否已经到达 a 的末尾
if (i + j >= n) {
return Integer.parseInt(aStr + bStr);
}
// 检查 b 的当前字符是否大于 a 的当前字符
if (bStr.charAt(j) > aStr.charAt(i + j)) {
return Integer.parseInt(aStr.substring(0, i) + bStr + aStr.substring(i));
}
}
}
// 如果遍历完所有字符都没有找到比 b 小的数字,将 b 插入到末尾
return Integer.parseInt(aStr + bStr);
}
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);
}
}
Go 代码实现
package main
import (
"fmt"
"strconv"
)
func solution(a int, b int) int {
// 将 a 转换为字符串
aStr := strconv.Itoa(a)
n := len(aStr)
// 将 b 转换为字符串
bStr := strconv.Itoa(b)
t := len(bStr)
// 遍历字符串 a
for i := 0; i < n; i++ {
// 遍历字符串 b
for j := 0; j < t; j++ {
// 检查是否已经到达 a 的末尾
if i+j >= n {
result, _ := strconv.Atoi(aStr + bStr)
return result
}
// 检查 b 的当前字符是否大于 a 的当前字符
if bStr[j] > aStr[i+j] {
result, _ := strconv.Atoi(aStr[:i] + bStr + aStr[i:])
return result
}
}
}
// 如果遍历完所有字符都没有找到比 b 小的数字,将 b 插入到末尾
result, _ := strconv.Atoi(aStr + bStr)
return result
}
func main() {
fmt.Println(solution(76543, 4) == 765443)
fmt.Println(solution(1, 0) == 10)
fmt.Println(solution(44, 5) == 544)
fmt.Println(solution(666, 6) == 6666)
}
Python 代码实现
def solution(a: int, b: int) -> int:
# 将 a 转换为字符串
a_str = str(a)
n = len(a_str)
# 将 b 转换为字符串
b_str = str(b)
t = len(b_str)
# 遍历字符串 a
for i in range(n):
# 遍历字符串 b
for j in range(t):
# 检查是否已经到达 a 的末尾
if i + j >= n:
return int(a_str + b_str)
# 检查 b 的当前字符是否大于 a 的当前字符
if b_str[j] > a_str[i + j]:
return int(a_str[:i] + b_str + a_str[i:])
# 如果遍历完所有字符都没有找到比 b 小的数字,将 b 插入到末尾
return int(a_str + b_str)
if __name__ == '__main__':
print(solution(76543, 4) == 765443)
print(solution(1, 0) == 10)
print(solution(44, 5) == 544)
print(solution(666, 6) == 6666)