小U的数字插入问题 | 豆包MarsCode AI刷题

38 阅读3分钟

问题描述

小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)