一、题目解析:版本号比较问题
问题描述
在某个项目中,每个版本都用版本号标记,由一个或多个修订号组成,修订号之间由点号 . 分隔。每个修订号可能有多位数字,并且可能会包含前导零。你需要根据两个版本号 version1 和 version2,判断哪个版本更新,或者它们是否相同。
当比较两个版本时,从左到右依次比较它们的修订号。忽略每个修订号的前导零,直接比较修订号对应的整数值。如果其中一个版本没有足够的修订号,缺失部分默认补为 0。
你需要根据以下规则返回比较结果:
- 如果
version1 > version2,返回1。 - 如果
version1 < version2,返回-1。 - 如果两个版本相等,返回
0。
输入
version1: 第一个版本号version2: 第二个版本号
返回
- 比较结果,
1表示version1更新,-1表示version2更新,0表示两个版本相同。
参数限制
- 1 <=
version1.length,version2.length<= 500 version1和version2仅包含数字和.
题目思路
- 分割版本号:使用
split方法将版本号按.分割成数组。 - 比较修订号:从左到右依次比较两个版本号的修订号,忽略前导零,直接比较整数值。
- 处理长度不同的情况:如果一个版本号的修订号数量少于另一个版本号,缺失部分默认补为
0。 - 返回结果:根据比较结果返回
1、-1或0。
具体操作步骤
-
分割版本号:
- 使用
split("\.")方法将version1和version2分割成数组v1和v2。
- 使用
-
比较修订号:
- 遍历两个数组,依次比较对应位置的修订号。
- 如果
v1[i]转换为整数后大于v2[i],返回1。 - 如果
v1[i]转换为整数后小于v2[i],返回-1。
-
处理长度不同的情况:
- 如果
v1的长度大于v2,检查v1剩余部分是否全为0,如果不是,返回1。 - 如果
v2的长度大于v1,检查v2剩余部分是否全为0,如果不是,返回-1。
- 如果
-
返回结果:
- 如果所有修订号都相同,返回
0。
- 如果所有修订号都相同,返回
代码实现
public static int solution(String version1, String version2) {
// Edit your code here
String[] v1 = version1.split("\\.");
String[] v2 = version2.split("\\.");
int l1 = v1.length;
int l2 = v2.length;
for (int i = 0; i < l1 && i < l2; i++) {
int re1 = Integer.parseInt(v1[i]);
int re2 = Integer.parseInt(v2[i]);
if (re1 > re2) {
return 1;
}
if (re1 < re2) {
return -1;
} else {
continue;
}
}
//若由于长度不同未比较出结果
//已知此时前l1-l2的部分相同
if (l1 > l2) {
for(int i=l1-l2; i<l1; i++) {
int re1 = Integer.parseInt(v1[i]);
if(re1!=0)
return 1;
}
}
if(l2 > l1) {
for(int i=l2-l1; i<l2; i++) {
int re2 = Integer.parseInt(v2[i]);
if(re2!=0)
return -1;
}
}
return 0;
}
}
二、知识总结:字符串操作和正则
Java 中的字符串操作
Java 中的字符串是通过 String 类来表示的。以下是一些常用的字符串操作方法:
-
创建字符串:
String str1 = "Hello, World!"; String str2 = new String("Hello, World!"); -
字符串长度:
int length = str1.length(); -
字符串拼接:
String str3 = str1 + " How are you?"; String str4 = str1.concat(" How are you?"); -
字符串比较:
boolean isEqual = str1.equals(str2); boolean isEqualIgnoreCase = str1.equalsIgnoreCase(str2); int comparison = str1.compareTo(str2); -
查找子字符串:
boolean contains = str1.contains("World"); int index = str1.indexOf("World"); int lastIndex = str1.lastIndexOf("o"); boolean startsWith = str1.startsWith("Hello"); boolean endsWith = str1.endsWith("World!"); -
提取子字符串:
String subStr1 = str1.substring(7); String subStr2 = str1.substring(7, 12); -
字符串替换:
String replacedStr = str1.replace("World", "Java"); String replacedAllStr = str1.replaceAll("o", "0"); -
字符串拆分:
String[] parts = str1.split(", "); -
去除空白:
String trimmedStr = str1.trim(); -
转换大小写:
String upperStr = str1.toUpperCase(); String lowerStr = str1.toLowerCase(); -
字符串转字符数组:
char[] charArray = str1.toCharArray();
- split:
split(String regex)方法根据给定的正则表达式分割字符串,返回字符串数组。 - Integer.parseInt:将字符串解析为整数,忽略前导零。
正则表达式简介
正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的模式。它可以用于查找、替换、验证字符串等操作。
常用正则表达式符号
.:匹配任意单个字符。*:匹配前面的字符零次或多次。+:匹配前面的字符一次或多次。?:匹配前面的字符零次或一次。\d:匹配任意数字。\w:匹配任意字母、数字或下划线。\s:匹配任意空白字符。^:匹配字符串的开头。$:匹配字符串的结尾。[]:匹配括号内的任意字符。|:表示或运算。
Java 中的正则表达式
在 Java 中,正则表达式通常用于字符串的匹配、查找和替换操作。常用的方法有:
String.split(String regex):根据正则表达式分割字符串,返回字符串数组。String.matches(String regex):判断字符串是否匹配正则表达式。String.replaceAll(String regex, String replacement):将匹配正则表达式的部分替换为指定字符串。