题目要求:
请根据语义化版本的要求 https://semver.org/lang/zh-CN/ ,比较两个"语义化版本"
传入两个形如x.y.z的字符串,比较两个语义化版本的大小。如果version1小于version2,返回-1;如果version1大于version2,返回1。如果二者相等,返回0。
注意,如果传入的字符串形如x,则其等价于x.0.0。 如果传入的字符串形如x.y,则其等价于x.y.0。
方法有两个参数:
version1 传入的版本字符串1,支持x/x.y/x.y.z,你可以假定传入的字符串一定是合法的语义化版本
version2 传入的版本字符串2,支持x/x.y/x.y.z,你可以假定传入的字符串一定是合法的语义化版本
返回结果:
-1/0/1 当version1 小于/等于/大于 version2时
解题思路: 将语义化版本拆解成三个int值,按顺序对比两个语义化版本每个值得大小。
例如1.10.0
和1.9.1
比,1.10.0
更大,返回结果1
普通实现版:
// 对比两个版本大小
public static int compare(String version1, String version2) {
// 填充完整版本号
String[] version1Arr = getAllVersion(version1).split("\\.");
// 填充完整版本号
String[] version2Arr = getAllVersion(version2).split("\\.");
// 对比大版本
int res = compareInt(Integer.parseInt(version1Arr[0]), Integer.parseInt(version2Arr[0]));
if (res != 0) {
return res;
}
// 对比中版本
res = compareInt(Integer.parseInt(version1Arr[1]), Integer.parseInt(version2Arr[1]));
if (res != 0) {
return res;
}
// 对比小版本
return compareInt(Integer.parseInt(version1Arr[2]), Integer.parseInt(version2Arr[2]));
}
// 比较两个数字的大小
private static int compareInt(int version1, int version2) {
if (version1 < version2) {
return -1;
} else if (version1 > version2) {
return 1;
} else {
return 0;
}
}
// 填充不完整的version,例如将1,补充成1.0.0,将1.1补充成1.1.0
private static String getAllVersion(String version) {
String[] versionArr = version.split("\\.");
String newVersion = versionArr[0];
for (int i = 1; i <= 2; i++) {
if (versionArr.length > i) {
newVersion += "." + versionArr[i];
} else {
newVersion += ".0";
}
}
return newVersion;
}
精简实现版:
// 版本语义最大长度
private static final int MAX_LENGTH = 3;
public static int compare(String version1, String version2) {
// 拆分
String[] version1Arr = version1.split("\\.");
String[] version2Arr = version2.split("\\.");
for (int i = 0; i < MAX_LENGTH; i++) {
// 数组长度不够 0 来填补,否则直接转换为int
int v1 = version1Arr.length > i ? Integer.parseInt(version1Arr[i]) : 0;
int v2 = version2Arr.length > i ? Integer.parseInt(version2Arr[i]) : 0;
// 不相等则比较大小,分出结果
if (v1 != v2) {
return v1 < v2 ? -1 : 1;
}
}
// 完全相等返回0
return 0;
}