165.比较版本号Java
题目描述
假给你两个版本号version1和version2,请你比较它们。
版本号由一个或多个修订号组成,各修订号由一个’.’连接。每个修订号由多位数字组成,可能包含前导零。每个版本号至少包含一个字符。修订号从左到右编号,下标从О开始,最左边的修订号下标为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 = “0.1”, version2 = “1.1”
输出:-1
解释:version1 中下标为 0 的修订号是 “0”,version2 中下标为 0 的修订号是 “1” 。0 < 1,所以 version1 < version2。
本题来自LeetCode:https://leetcode-cn.com/problems/compare-version-numbers/
思路
首先利用字符串分割,按“.”对字符串进行分割,存到字符串数组中。然后将version1和version2转换后的字符串数组进行比较,将字符串转为整数类型进行大小比较。如果版本号不存在后续的修订号,则它的修订号应该默认为0。
除了字符分割外,还可以使用双指针扫描来解决该问题。使用双指针相对于分割字符节省了存放分割后字符的空间。
算法分析
时间复杂度O(n + m),空间复杂度为O(n + m);这里n和m分别对应传入的两个字符串长度。
求解函数
public int compareVersion(String version1, String version2) {
//按照“.”对字符串进行分割,并存到字符串数组
String[] s1 = version1.split("\\.");
String[] s2 = version2.split("\\.");
for (int i = 0; i < s1.length || i < s2.length; ++i) {
//默认修订号为0,防止没有修订号
int x = 0, y = 0;
if (i < s1.length) {
x = Integer.parseInt(s1[i]);
}
if (i < s2.length) {
y = Integer.parseInt(s2[i]);
}
if (x > y) return 1;
if (x < y) return -1;
}
return 0;
}