大家好,今天我们来看【小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 类方法
-
valueOf(Object obj)
将其他类型转换成字符串。例如,String.valueOf(123)会返回"123"。 -
substring(int start, int end)
返回一个子字符串,从start索引到end索引之间的部分(不包括end)。例如,"abcdef".substring(1, 4)返回"bcd"。 -
compareTo(String anotherString)
比较两个字符串的字典顺序。如果当前字符串大于另一个字符串,则返回一个正整数;如果小于,则返回负整数;如果相等,则返回 0。 -
charAt(int index)
返回指定索引位置的字符。例如,"abc".charAt(1)返回'b'。 -
length()
返回字符串的长度。即字符串中字符的数量。 -
+操作符
可以用来将两个字符串拼接起来。例如,"hello" + "world"结果是"helloworld"。
包装类
包装类(Wrapper Class)
在 Java 中,包装类(Wrapper Class) 是一种用于将基本数据类型(如 int、char、boolean 等)封装为对象的类。每个基本数据类型都有对应的包装类。包装类提供了对基本数据类型的对象化支持,可以让它们与对象相关的操作(如存储在集合类中、执行方法调用等)一起使用。
基本数据类型与包装类的对应关系:
| 基本数据类型 | 包装类 |
|---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
为什么需要包装类?
-
对象需求:一些 Java 类库(如集合类)只能处理对象,而不能直接存储基本数据类型。包装类提供了一个途径,使得基本类型可以像对象一样使用。
-
自动装箱和拆箱:Java 5 引入了 自动装箱(Autoboxing) 和 拆箱(Unboxing) 特性,允许基本数据类型和对应的包装类之间的自动转换,这使得开发更简洁。
-
方法参数:很多时候方法的参数需要对象类型而不是基本数据类型,包装类可以让你将基本类型值传递给需要对象的接口或方法。
-
存储空值(null):基本数据类型不能为
null,而包装类可以为null,使得能够表示缺失值。
常见的包装类用法
1. 自动装箱和拆箱
Java 从 1.5 版本开始支持自动装箱(Autoboxing)和拆箱(Unboxing),这意味着 Java 会自动地将基本数据类型转换为相应的包装类对象,或者将包装类对象转换为基本数据类型。
-
自动装箱(基本类型 → 对象):
int a = 10; Integer b = a; // 自动装箱 -
自动拆箱(对象 → 基本类型):
Integer a = 10; int b = a; // 自动拆箱
这种机制使得开发者不再需要显式地进行装箱和拆箱操作,代码更加简洁。
2. 包装类的构造方法
包装类通常没有显式的构造方法,且不推荐直接使用构造方法来创建包装类对象。使用 valueOf() 方法会更好,因为它采用了缓存机制,能够提高性能(对于 Integer 和 Long 特别有效)。
-
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 -
equals和compareTo方法:比较两个包装类对象的值。Integer a = 10; Integer b = 10; System.out.println(a.equals(b)); // true,比较值是否相等 System.out.println(a.compareTo(b)); // 0,表示相等 -
intValue、doubleValue等方法:获取包装类对象对应的基本数据类型值。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 通过自动装箱和拆箱机制,使得基本类型和包装类对象之间的转换更加便捷。
日常编程中会经常遇到包装类的使用,尤其是在处理集合、字符串解析和对象存储时。