豆包MarsCode:小U的数字插入问题

news/2024/12/23 20:44:25 标签: java, 算法

问题描述

在这里插入图片描述


问题分析

问题的核心是找到将数字 b 插入到数字 a 的某个位置后,使形成的数字尽可能大。需要仔细分析以下几个要点:

1. 分析数字的特性

  • 输入的两个数字:
    • a 是一个正整数(例如 76543)。
    • b 是一个非负整数(例如 4)。
  • 目标
    b 插入 a 的某个位置后,获得最大的数字。

2. 数字的插入方式

  • 数字插入可以通过 b 放在 a 的每两个相邻数字之间 来实现。
    • 例如,对于 a = 76543b = 4
      • 插入到开头:476543
      • 插入到 7 和 6 之间:746543
      • 插入到 6 和 5 之间:765443
      • 插入到 5 和 4 之间:765453
      • 插入到末尾:765434
    • 按位置遍历所有可能的插入结果,找到其中最大的数字。

3. 需要考虑的情况

Case 1: b 插入的最佳位置

插入后的数字大小取决于:

  • b 是否比当前数字大(例如 b = 4a = 76543,将 4 插在比它小的数字前可能获得最大值)。
  • 必须比较插入前后数字的大小,确保选择最大的。

Case 2: 边界条件

  • a 的长度a 可以是任意正整数,单个数字(如 1)、多位数字(如 54321)都需要正确处理。
  • b = 0 的特殊情况
    • 插入 0 时,由于 0 的数值较小,可能需要插在数字的末尾(除非插在较小的数字后可以形成更大的结果)。
    • 例如 a = 1, b = 0,正确结果为 10

Case 3: 插入到字符串的末尾

插入的位置还包括 末尾,即需要遍历的插入点包括从第 0 位到最后一位(length + 1 次尝试)。

4. 如何实现

  1. 将数字转换为字符串:便于操作每个插入点。
  2. 生成每个插入结果:遍历可能的插入位置,将 b 插入到 a 的字符串中,形成一个新的字符串。
  3. 比较最大值:在遍历过程中,比较所有生成的结果,保留其中的最大值。
  4. 返回结果:最后输出最大值。

5. 示例分析

示例 1:

输入:a = 76543, b = 4

插入操作:

  • 插入到第 0 位:476543
  • 插入到第 1 位:746543
  • 插入到第 2 位:765443 (最大)
  • 插入到第 3 位:765453
  • 插入到末尾:765434

最大结果:765443

示例 2:

输入:a = 1, b = 0

插入操作:

  • 插入到第 0 位:01(等价于 10
  • 插入到末尾:10

最大结果:10

6. 问题解决的关键

  • 明确数字插入的每一种可能性。
  • 在每个可能性中,选择能构成最大值的结果。
  • 注意边界条件(例如 b = 0,或 a 为单个数字时的处理)。

参考代码(Java)

java">public class Main {
    public static int solution(int a, int b) {
        // 将整数a转换为字符串以便操作
        String aStr = String.valueOf(a);
        String bStr = String.valueOf(b);
        
        // 初始化最大结果
        String maxResult = "";

        // 遍历a的每个插入位置
        for (int i = 0; i <= aStr.length(); i++) {
            // 在第i位置插入b
            String current = aStr.substring(0, i) + bStr + aStr.substring(i);

            // 更新最大值
            if (maxResult.isEmpty() || Integer.parseInt(current) > Integer.parseInt(maxResult)) {
                maxResult = current;
            }
        }

        // 返回结果转换为整数
        return Integer.parseInt(maxResult);
    }

    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);     
    }
}

代码分析

solution 方法分析

1. 输入处理
java">String aStr = String.valueOf(a);
String bStr = String.valueOf(b);
  • 目的:将输入的整数 ab 转换为字符串。
  • 原因:便于操作字符串中的每一位数字,同时允许插入操作变得简单。
  • 例如:a = 76543 被转换为 "76543"b = 4 被转换为 "4"
2. 最大值初始化
java">String maxResult = "";
  • 初始化最大结果为空字符串。
  • 之后通过比较插入结果,不断更新 maxResult
3. 遍历插入位置
java">for (int i = 0; i <= aStr.length(); i++) {
    String current = aStr.substring(0, i) + bStr + aStr.substring(i);
    ...
}
  • 遍历范围:从 i = 0i = aStr.length(),共 length + 1 次循环。
    • 例如,对于 "76543""4"
      • 插入到第 0 位(开头):476543
      • 插入到第 1 位:746543
      • 插入到第 2 位:765443
      • 插入到第 3 位:765453
      • 插入到末尾:765434
  • 字符串操作
    • aStr.substring(0, i):获取从起始位置到第 i 位之前的字符串。
    • bStr:将 b 插入当前位置。
    • aStr.substring(i):获取从第 i 位到字符串末尾的内容。
    • 最终拼接生成插入后的新字符串。
4. 比较最大值
java">if (maxResult.isEmpty() || Integer.parseInt(current) > Integer.parseInt(maxResult)) {
    maxResult = current;
}
  • maxResult.isEmpty():初次循环时,直接将第一个结果作为初始值。
  • Integer.parseInt:将字符串 current 转换为整数,便于数值大小比较。
  • 更新最大值:如果当前插入结果比之前的最大值大,则更新 maxResult
5. 返回结果
java">return Integer.parseInt(maxResult);
  • 最后将字符串形式的最大值 maxResult 转换为整数并返回。

代码性能分析

  1. 时间复杂度
    • 遍历插入点需要 O(n) 次操作(na 的位数)。
    • 每次插入后比较大小需要将字符串转换为整数(O(k)k 为插入后字符串的位数)。
    • 总时间复杂度O(n * k)
  2. 空间复杂度
    • aStrbStr 占用 O(n + 1) 的空间(na 的长度,1b 的长度)。
    • 中间字符串 current 也占用 O(n + 1) 的空间。
    • 总空间复杂度O(n)

http://www.niftyadmin.cn/n/5796978.html

相关文章

金融保险行业数字化创新实践:如何高效落地自主可控的企业级大数据平台

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量替代 OGG, Kettle 等同步工具&#xff0c;以及基于 Kafka 的 ETL 解决方案&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业…

CTF入门:以Hackademic-RTB1靶场为例初识夺旗

一、网络扫描 靶机ip地址为192.168.12.24 使用nmap工具进行端口扫描 nmap -sT 192.168.12.24 二、信息收集 1、80端口探索 靶机开放了80和22端口&#xff0c;使用浏览器访问靶机的80端口&#xff0c;界面如下&#xff1a; 点击target发现有跳转&#xff0c;并且url发生相应变…

分布式协同 - 分布式事务_2PC 3PC解决方案

文章目录 导图Pre2PC&#xff08;Two-Phase Commit&#xff09;协议准备阶段提交阶段情况 1&#xff1a;只要有一个事务参与者反馈未就绪&#xff08;no ready&#xff09;&#xff0c;事务协调者就会回滚事务情况 2&#xff1a;当所有事务参与者均反馈就绪&#xff08;ready&a…

常用类晨考day15

1.基本数据类型以及对应包装类 Byte Short Integer Long Float Double Boolean Character 2.什么是自动拆箱和装箱&#xff0c;jdk版本有什么要求&#xff1f;代码举 例并标明 Integer a 100; // 装箱 int b a; // 拆箱 从JDK1.5才开始支持 3.NumberFormatException是什么异常…

ES6学习函数(四)

这里写目录标题 一、带参数默认值的函数二、rest参数三、箭头函数一、箭头函数二、箭头函数的作用2.1、使表达更加简洁2.2、简化回调函数 三、箭头函数使用注意点3.1、没有this绑定3.2、箭头函数中没有arguments对象3.3、箭头函数不能使用new关键字来实例化对象 一、带参数默认…

c++---------数据类型

基本数据类型 整数类型&#xff08;Integral Types&#xff09; int&#xff08;整型&#xff09; 这是最常用的整数类型&#xff0c;通常用于存储一般范围的整数值。在32位系统中&#xff0c;int类型一般占用4个字节&#xff0c;取值范围大约是 - 2147483648到2147483647。例如…

Cmd命令大全(万字详细版)

1. 常用命令 1.1 cd命令 //进入d盘 D: //进入F盘 F: cd /? //获取使用帮助cd \ //跳转到硬盘的根目录cd C:\WINDOWS //跳转到当前硬盘的其他文件d: //跳转到其他硬盘cd /d e:\software //跳转到其他硬盘的其他文件夹&#xff0c;注意此处必须加/d参数。…

瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 文章目录 7 修改员工信息7.1 启用/禁用员工账号7.1.1 需求梳理7.1.2…