一、题目
题目较长,需要看题目请移步下方链接。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compare-version-numbers
二、解题思路
代码写得有点长,但整体思路比较简单,首先分别将两个版本号按 '.' 进行切割成段,放入vector数组中,每一段为数组中的一项,然后只需要对两个数组进行逐项比较,按照题目要求的大小关系返回对应的值即可。
这里需要注意的是两个版本号的段数不一定相同,所以是先比较前面长度相同的段,若前面长度相同的段代表的值都相同,再看后面多出的段是否大于0即可。
三、代码
class Solution {
public:
int compareVersion(string version1, string version2) {
int len1 = version1.size();
int len2 = version2.size();
int index1 =0, index2 = 0;
vector<string> vs1; //存放版版本号1 的每个分开部分
vector<string> vs2; //存放版本号2的每个分开部分
while(index1 < len1 || index2 < len2){ //将两个版本号按'.'切割放到数组中
int tmp1 = index1, tmp2 = index2;
while(index1 < len1 && version1[index1] != '.'){
index1++;
}
if(tmp1 < len1){
vs1.push_back(version1.substr(tmp1, index1));
index1++;
}
while(index2 < len2 && version2[index2] != '.'){
index2++;
}
if(tmp2 < len2){
vs2.push_back(version2.substr(tmp2, index2));
index2++;
}
}
len1 = vs1.size();
len2 = vs2.size();
index1 =0, index2 =0;
while(index1 < len1 && index2 < len2){ //对切割好的版本号逐段进行比较
int tmp1 = atoi(vs1[index1].c_str()); //将字符串型转换为整数型
int tmp2 = atoi(vs2[index2].c_str());
if(tmp1 > tmp2) return 1;
if(tmp1 < tmp2) return -1;
index1++;
index2++;
}
while(index1 < len1){ //version1 的段数更多,且前面各段均和version相同,判断后面是否大于0
int tmp1 = atoi(vs1[index1].c_str());
if(tmp1 > 0) return 1;
index1++;
}
while(index2 < len2){ //version1 的段数更多,且前面各段均和version相同,判断后面是否大于0
int tmp2 = atoi(vs2[index2].c_str());
if(tmp2 > 0) return -1;
index2++;
}
return 0;
}
};