问题描述


难度:中等


给你两个版本号version1和version2,请你比较它们。


版本号由一个或多个修订号组成,各修订号由一个'.'连接。每个修订号由多位数字组成,可能包含前导零每个版本号至少包含一个字符。修订号从左到右编号,下标从0开始,最左边的修订号下标为0,下一个修订号下标为1,以此类推。例如,2.5.33和0.1都是有效的版本号。


比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。也就是说,修订号1和修订号001相等。如果版本号没有指定某个下标处的修订号,则该修订号视为0。例如,版本1.0小于版本1.1,因为它们下标为0的修订号相同,而下标为1的修订号分别为0和1,0<1。


返回规则如下:


  • 如果version1>version2返回1,
  • 如果version1<version2返回-1,
  • 除此之外返回0。


示例 1:


输入:version1 = "1.01", version2 = "1.001"

输出:0

解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"


示例 2:


输入:version1 = "1.0", version2 = "1.0.0"

输出:0

解释:version1 没有指定下标为 2 的修订号,即视为 "0"


示例 3:



输入:version1 = "0.1", version2 = "1.1"

输出:-1

解释:version1 中下标为 0 的修订号是 "0",version2 中下标为 0 的修订号是 "1" 。0 < 1,所以 version1 < version2


示例 4:



输入:version1 = "1.0.1", version2 = "1"

输出:1


示例 5:



输入:version1 = "7.5.2.4", version2 = "7.5.3"

输出:-1



提示:


  • 1<=version1.length,version2.length<=500
  • version1和version2仅包含数字和'.'
  • version1和version2都是 有效版本号
  • version1和version2的所有修订号都可以存储在32位整数中



问题分析



这题让比较版本号,版本号是由一串数字通过小数点(.)分开的。我们每次先比较小数点前面的数字,确定是否相等,如果不相等直接返回,不需要再比较后面的值了。如果相等,就要继续后面值的比较。这题基本上没有什么难度,我们来看下代码。

public int compareVersion(String version1, String version2) {
int len1 = version1.length();//第一个版本号的长度
int len2 = version2.length();//第二个版本号的长度
int index1 = 0;//访问到第一个版本号字符的位置
int index2 = 0;//同上
while (index1 < len1 || index2 < len2) {
int ver1 = 0;
int ver2 = 0;
//先把第一个版本号(.)前面的数字转换成int类型
while (index1 < len1 && version1.charAt(index1) != '.') {
ver1 = ver1 * 10 + version1.charAt(index1++) - '0';
}
//在把第二个版本号(.)前面的数字转换成int类型
while (index2 < len2 && version2.charAt(index2) != '.') {
ver2 = ver2 * 10 + version2.charAt(index2++) - '0';
}
//比较这两个数字的大小,如果不相等直接返回
if (ver1 > ver2) {
return 1;
} else if (ver1 < ver2) {
return -1;
} else {
//如果这两个数字相等,就继续后面的比较,
//这里都加1表示跳过符号(.)
index1++;
index2++;
}
}
return 0;
}

时间复杂度:O(m+n),m和n分别表示两个字符串的长度。

空间复杂度:O(1)。