Leetcode——比较版本号
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——比较版本号相关的知识,希望对你有一定的参考价值。
1. 比较版本号
(1)字符串模拟
- 对字符串进行分割,诸位比较「修订号」大小即可。
- 对于缺省的修订号位置,使用 00 进行代指。
时间复杂度:令 v1 长度为 n,v2 长度为 m。整体复杂度为O(max(n,m))
空间复杂度:O(n + m)O(n+m)
class Solution {
//对字符串进行分割,诸位比较「修订号」大小即可。
//对于缺省的修订号位置,使用 00 进行代指。
public int compareVersion(String v1, String v2) {
String[] ss1 = v1.split("\\\\."), ss2 = v2.split("\\\\.");
int n = ss1.length, m = ss2.length;
int i = 0, j = 0;
while (i < n || j < m) {
int a = 0, b = 0;
if (i < n)
a = Integer.parseInt(ss1[i++]);
if (j < m)
b = Integer.parseInt(ss2[j++]);
if (a != b)
return a > b ? 1 : -1;
}
return 0;
}
}
(2)双指针
其实,我们也可以自己分割。
同时,我们可以边分割边比较,并不一定需要完全分割完,可能大版本号不同,就可以提前返回了。
时间复杂度:O(max(m,n)),或者 O(m+n),同方法一。
空间复杂度:O(1),除了常数个变量不占用额外的空间。
class Solution {
public int compareVersion(String version1, String version2) {
// 初始时两个指针都在开头
int i = 0, j = 0;
// 任意一个没到头就继续
while (i < version1.length() || j < version2.length()) {
int v1 = 0, v2 = 0;
// 找到 version1 这一截的版本号
if (i < version1.length()) {
int start = i;
// 注意边界
while (i < version1.length() && version1.charAt(i) != '.') {
i++;
}
v1 = Integer.parseInt(version1.substring(start, i));
}
// 找到 version2 这一截的版本号
if (j < version2.length()) {
int start = j;
while (j < version2.length() && version2.charAt(j) != '.') {
j++;
}
v2 = Integer.parseInt(version2.substring(start, j));
}
if (v1 != v2) {
return v1 > v2 ? 1 : -1;
}
// 同时移动到 . 的下一位
i++;
j++;
}
return 0;
}
}
以上是关于Leetcode——比较版本号的主要内容,如果未能解决你的问题,请参考以下文章