***、题目链接
一、题目
1、题目描述
给你两个版本号
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
。
样例输入:version1 = "1.01", version2 = "1.001"
;
样例输出:0
。
2、基础框架
- C++给出的代码框架如下:
class Solution {
public:
int compareVersion(string version1, string version2) {
}
};
二、解题报告
1、思路分析
(
1
)
(1)
(1) 以 '.'
为分割符,切割字符串;
(
2
)
(2)
(2) 计算每段除前导零的数是否相同。
2、时间复杂度
O ( n ) O(n) O(n) ,;
3、代码详解
class Solution {
public:
int compareVersion(string version1, string version2) {
int n = version1.length(), m = version2.length();
int i = 0, j = 0;
while (i < n || j < m) {
int x = 0;
for (; i < n && version1[i] != '.'; ++i) {
x = x * 10 + (version1[i] - '0');
}
++i; // 跳过点号
int y = 0;
for (; j < m && version2[j] != '.'; ++j) {
y = y * 10 + (version2[j] - '0');
}
++j; // 跳过点号
if (x != y) {
return x > y ? 1 : -1;
}
}
return 0;
}
};
三、写在最后
就是需要想到切割字符串这个方法,剩下没啥。