比较两个版本号 version1 和 version2。
如果version1 > version2
返回1
,如果version1 < version2
返回-1
, 除此之外返回0
。你可以假设版本字符串非空,并且只包含数字和
.
字符。
.
字符不代表小数点,而是用于分隔数字序列。例如,
2.5
不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。你可以假设版本号的每一级的默认修订版号为
0
。例如,版本号3.4
的第一级(大版本)和第二级(小版本)修订号分别为3
和4
。其第三级和第四级修订号均为0
。
示例 1:
输入:version1
= "0.1",version2
= "1.1" 输出: -1示例 2:
输入:version1
= "1.0.1",version2
= "1" 输出: 1示例 3:
输入:version1
= "7.5.2.4",version2
= "7.5.3" 输出: -1示例 4:
输入:version1
= "1.01",version2
= "1.001" 输出:0 解释:忽略前导零,“01” 和 “001” 表示相同的数字 “1”。示例 5:
输入:version1
= "1.0",version2
= "1.0.0" 输出:0 解释:version1
没有第三级修订号,这意味着它的第三级修订号默认为 “0”。
提示:
- 版本字符串由以点 (
.
) 分隔的数字字符串组成。这个数字字符串可能有前导零。- 版本字符串不以点开始或结束,并且其中不会有两个连续的点。
解法一:
//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
int compareVersion(string version1, string version2) {
int p1 = 0, p2 = 0;
int i1 = 0, i2 = 0;
while(p1 < version1.size() || p2 < version2.size()) {
while(i1 < version1.size() && version1[i1] != '.') i1++;
while(i2 < version2.size() && version2[i2] != '.') i2++;
int a = p1 < version1.size() ? stoi(version1.substr(p1, i1 - p1)) : 0;
int b = p2 < version2.size() ? stoi(version2.substr(p2, i2 - p2)) : 0;
if(a != b) return a < b ? -1 : 1;
i1++;
i2++;
p1 = i1;
p2 = i2;
}
return 0;
}
};
解法一:
两个字符串同时遍历,每次抽取同一级版本号a和b(查找'.'),如果不同则返回a < b;否则继续。如果p1、p2已经超过了字符串长度,说明已经遍历完,此时令版本号为0。
2019/12/31 13:24