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
class Solution {
public:
int compareVersion(string version1, string version2) {
int pos1 = 0, pos2 = 0, pre1 = 0, pre2 = 0;
while(pos1 < version1.size() && pos2 < version2.size())
{
pos1 = version1.find('.', pos1) == std::string::npos ? version1.size() : version1.find('.', pos1);
pos2 = version2.find('.', pos2) == std::string::npos ? version2.size() : version2.find('.', pos2);
int cur = compare(version1.substr(pre1, pos1-pre1), version2.substr(pre2, pos2-pre2));
pos1++;
pos2++;
if(cur == 0)
{
pre1 = pos1;
pre2 = pos2;
}
else
return cur;
}
while(pos1 < version1.size() && (version1[pos1] == '0' || version1[pos1] == '.'))
{
pos1++;
}
while(pos2 < version2.size() && (version2[pos2] == '0' || version2[pos2] == '.' ))
{
pos2++;
}
if(pos1 < version1.size())
return 1;
else if(pos2 < version2.size())
return -1;
else
return 0;
}
private:
int compare( string v1, string v2)
{
while(!v1.empty() && v1[0] == '0')
{
v1 = v1.size() > 1 ? v1.substr(1) : "";
}
while(!v2.empty() && v2[0] == '0')
{
v2 = v2.size() > 1 ? v2.substr(1) : "";
}
int l1 = v1.size();
int l2 = v2.size();
if(l1 == l2)
{
for(int i = 0; i < l1; i++)
{
if(v1[i] == v2[i])
continue;
else
{
return v1[i] - v2[i] > 0 ? 1 : -1;
}
}
return 0;
}
else
return l1 > l2 ? 1 : -1;
}
};