从简单题复习JavaEE-小U的数字插入问题 | 豆包MarsCode AI刷题

31 阅读6分钟

大家好,今天我们来看【小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

在我们看到这道题的时候,会大概有‘这道题需要我们把a拆开再把b合进去’这样的想法,这就涉及到了很多String类和包装类的方法,今天我们就借着这道题,把Java String类和包装类的相关知识复习一下。

public class Main {
    public static int solution(int a, int b) {
        // 将 a、b 转换为字符串
        String aStr = String.valueOf(a);
        String bStr = String.valueOf(b);
        
        // 初始化最大值为a的当前值
        String maxNumber = aStr;
        
        // 遍历 a 的每一位
        for (int i = 0; i <= aStr.length(); i++) {
            // 尝试将 b 插入到a的第i位
            //创建一个新字符串newNumber:a的0-i位 + b + a的i位之后
            String newNumber = aStr.substring(0, i) + bStr + aStr.substring(i);
            
            // 比较新形成的数字与当前最大值
            if (newNumber.compareTo(maxNumber) > 0) {
                maxNumber = newNumber;
            }
        }
        
        // 返回最大值
        return Integer.parseInt(maxNumber);
    }

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

String方法

常用的 String 类方法

  1. valueOf(Object obj)
    将其他类型转换成字符串。例如,String.valueOf(123) 会返回 "123"

  2. substring(int start, int end)
    返回一个子字符串,从 start 索引到 end 索引之间的部分(不包括 end)。例如,"abcdef".substring(1, 4) 返回 "bcd"

  3. compareTo(String anotherString)
    比较两个字符串的字典顺序。如果当前字符串大于另一个字符串,则返回一个正整数;如果小于,则返回负整数;如果相等,则返回 0。

  4. charAt(int index)
    返回指定索引位置的字符。例如,"abc".charAt(1) 返回 'b'

  5. length()
    返回字符串的长度。即字符串中字符的数量。

  6. + 操作符
    可以用来将两个字符串拼接起来。例如,"hello" + "world" 结果是 "helloworld"

包装类

包装类(Wrapper Class)

在 Java 中,包装类(Wrapper Class) 是一种用于将基本数据类型(如 intcharboolean 等)封装为对象的类。每个基本数据类型都有对应的包装类。包装类提供了对基本数据类型的对象化支持,可以让它们与对象相关的操作(如存储在集合类中、执行方法调用等)一起使用。

基本数据类型与包装类的对应关系:

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

为什么需要包装类?

  1. 对象需求:一些 Java 类库(如集合类)只能处理对象,而不能直接存储基本数据类型。包装类提供了一个途径,使得基本类型可以像对象一样使用。

  2. 自动装箱和拆箱:Java 5 引入了 自动装箱(Autoboxing)拆箱(Unboxing) 特性,允许基本数据类型和对应的包装类之间的自动转换,这使得开发更简洁。

  3. 方法参数:很多时候方法的参数需要对象类型而不是基本数据类型,包装类可以让你将基本类型值传递给需要对象的接口或方法。

  4. 存储空值(null):基本数据类型不能为 null,而包装类可以为 null,使得能够表示缺失值。

常见的包装类用法

1. 自动装箱和拆箱

Java 从 1.5 版本开始支持自动装箱(Autoboxing)和拆箱(Unboxing),这意味着 Java 会自动地将基本数据类型转换为相应的包装类对象,或者将包装类对象转换为基本数据类型。

  • 自动装箱(基本类型 → 对象):

    int a = 10;
    Integer b = a;  // 自动装箱
    
  • 自动拆箱(对象 → 基本类型):

    Integer a = 10;
    int b = a;  // 自动拆箱
    

这种机制使得开发者不再需要显式地进行装箱和拆箱操作,代码更加简洁。

2. 包装类的构造方法

包装类通常没有显式的构造方法,且不推荐直接使用构造方法来创建包装类对象。使用 valueOf() 方法会更好,因为它采用了缓存机制,能够提高性能(对于 IntegerLong 特别有效)。

  • valueOf 方法

    Integer x = Integer.valueOf(10);  // 推荐
    Integer y = Integer.valueOf("123");  // 从字符串转换
    
  • 构造方法(不推荐使用):

    Integer x = new Integer(10);  // 过时,不推荐使用
    

3. 字符串与包装类之间的转换

有时我们需要将包装类对象转换成字符串,或者将字符串转换成包装类对象。包装类提供了一些方便的方法来完成这些操作。

  • 将字符串转换为包装类对象

    String str = "123";
    Integer x = Integer.valueOf(str);  // 将字符串 "123" 转换为 Integer
    
  • 将包装类对象转换为字符串

    Integer x = 123;
    String str = x.toString();  // 将 Integer 转换为字符串 "123"
    

4. 常用的方法

包装类提供了一些有用的方法来进行类型转换、比较和解析等操作:

  • parseXxx 方法:将字符串转换为相应类型的值(例如:Integer.parseInt()Double.parseDouble() 等)。

    String str = "100";
    int x = Integer.parseInt(str);  // 解析字符串 "100" 为 int 类型
    
  • valueOf 方法:将基本数据类型转换为包装类对象,或者将字符串转换为包装类对象。

    Integer x = Integer.valueOf(10);   // 将基本类型 10 转为 Integer
    Double y = Double.valueOf("3.14"); // 将字符串 "3.14" 转为 Double
    
  • equalscompareTo 方法:比较两个包装类对象的值。

    Integer a = 10;
    Integer b = 10;
    System.out.println(a.equals(b));  // true,比较值是否相等
    
    System.out.println(a.compareTo(b));  // 0,表示相等
    
  • intValuedoubleValue 等方法:获取包装类对象对应的基本数据类型值。

    Integer x = 100;
    int a = x.intValue();  // 获取包装类对象对应的 int 值
    

5. 常见的包装类操作示例

  • 使用包装类存储到集合中 Java 集合类(如 ArrayList)只能存储对象,因此需要使用包装类来存储基本数据类型:

    ArrayList<Integer> list = new ArrayList<>();
    list.add(10);  // 自动装箱,将基本类型 10 转为 Integer
    list.add(20);
    System.out.println(list);  // 输出 [10, 20]
    
  • 比较包装类 使用包装类时,避免使用 == 运算符直接比较对象,应该使用 .equals().compareTo() 方法,因为 == 比较的是对象引用,而不是对象的值。

    Integer a = 100;
    Integer b = 100;
    Integer c = new Integer(100);
    
    System.out.println(a == b);       // true(由于 Java 会缓存 -128 到 127 的 Integer 对象)
    System.out.println(a == c);       // false,引用不同
    System.out.println(a.equals(c));  // true,值相等
    

总结

包装类是基本数据类型的对象化版本,可以在需要对象的场合使用基本数据类型。包装类为我们提供了许多有用的方法,简化了许多常见的操作,如类型转换、对象存储等。同时,Java 通过自动装箱和拆箱机制,使得基本类型和包装类对象之间的转换更加便捷。

日常编程中会经常遇到包装类的使用,尤其是在处理集合、字符串解析和对象存储时。