题目:leetcode
Compare two version numbers version1 and version1.
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
vector<int> getnum(const string &version)
{
vector<int> res;
int pre = 0;
for (int i = 0; i < version.size(); i++)
{
if (version[i] == '.')
{
string str(version.begin() + pre, version.begin() + i);
res.push_back(stoi(str));
pre = i + 1;
}
}
string str(version.begin() + pre, version.end());
res.push_back(stoi(str));
return res;
}
int compare_version(const string &version1, const string &version2)
{
if (version1.empty() || version2.empty())
throw exception();
int count1 = 0, count2 = 0;
for (int i = 0; i<version1.size(); i++)
{
if (version1[i] == '.')
count1++;
}
for (int i = 0; i<version2.size(); i++)
{
if (version2[i] == '.')
count2++;
}
if (count1>count2)
return -1 * compare_version(version2, version1);
vector<int> num1 = getnum(version1);
vector<int> num2 = getnum(version2);
int index = 0;
while (index < num1.size())
{
if (num1[index] == num2[index])
index++;
else
break;
}
if (index == num1.size())
{
if (num1.size() == num2.size())
return 0;
//注意version2后面全是零的情况!!
while (index < num2.size())
{
if (num2[index] != 0)
return -1;
index++;
}
//注意version2后面全是零的情况!!如 1.2 与 1.2.0.0.0
return 0;
}
else
{
if (num1[index] > num2[index])
return 1;
else if (num1[index] < num2[index])
return -1;
else
return 0;
}
}