题目:
Compare two version numbers version1 and version2.
If version1 > version2 return 1, if version1 < version2 return -1, otherwise return 0.
You may assume that the version strings are non-empty and contain only digits and the . character.
The . character does not represent a decimal point and is used to separate number sequences.
For instance, 2.5 is not “two and a half” or “half way to version three”, it is the fifth second-level revision of the second first-level revision.
Here is an example of version numbers ordering:
0.1 < 1.1 < 1.2 < 13.37
题意:
给定两个版本号,比较版本号的大小。版本号只由数字跟’.’符号组成。比如0.1 < 1.1 < 1.2 < 13.37
‘.’不是小数点,是用来区分每个子版本的,比如0.1代表的是第一层版本号是0,第二层版本号是1。
思路:
这道题其实就是按照’.’将版本号的每一层的数字提取出来,然后进行每一层的比较。有没有觉得很耳熟,其实这种比较就是字典比较。对两个vector进行比较就是采取的字典比较的方法。字符串转化为数字可以采用atoi来完成,它可以帮助你忽略多余的0,比如001其实就是1。但是需要注意的是比如1与1.0,其实这两个版本号是一样大的,不过由于装到vector中是{1}以及{1,0},vector的字典比较,当前面的元素都一样时,如果有个vector已经到了最末,那么无论另一个vector中是什么数据,更长的那个vector的值都更大,所以会出现{1}比{1,0}小的情况。采取的方法可以使用补齐的方式,即在短的那个vector后面补上一定数量的0,使得两个vector一样长。
以上。
代码如下:
class Solution {
public:
int compareVersion(string version1, string version2) {
vector<int> v1, v2;
int dot11 = -1, dot12 = -1;
int dot21 = -1, dot22 = -1;
int len1 = version1.length();
int len2 = version2.length();
while(dot12 <= len1)
{
if(dot12 == len1 || version1[dot12] == '.')
{
v1.push_back(atoi(version1.substr(dot11 + 1, dot12 - dot11 - 1).c_str()));
dot11 = dot12;
}
dot12++;
}
while(dot22 <= len2)
{
if(dot22 == len2 || version2[dot22] == '.')
{
v2.push_back(atoi(version2.substr(dot21 + 1, dot22 - dot21 - 1).c_str()));
dot21 = dot22;
}
dot22++;
}
int s1 = v1.size(), s2 = v2.size();
if(s1 < s2)
{
v1.insert(v1.end(), s2 - s1, 0);
}
else if(s2 < s1)
{
v2.insert(v2.end(), s1 - s2, 0);
}
int result = 0;
if(v1 > v2)result = 1;
else if(v1 < v2)result =-1;
return result;
}
};