题目链接:https://oj.leetcode.com/problems/compare-version-numbers/
Runtimes:2ms
1、问题
ompare 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
2、分析
本题目是版本比较大小一开始以为只有一个小数点,所以转换成小数进行比较,但是没想版本号也可以是1.200.03.0004,于是重新审视版本号。其一,不止一个点;其二,版本每个局部数字开头可以是0;其三,两个版本号的长度参差不齐。
3、小结
举个栗子:A(1.200.03.4) 与 B(0001.200.3) 比较版本号
从以上分析可以有对应的解题思路,首先比较对应的两个局部版本号可以看出,前3个局部版本号都一样(解题中我们将每个局部版本号转换成为整数再比较);此时需要继续判断A的第四个局部版本号,发现大于零,于是可以得出A的版本号大。假如A的第四个局部版本号等于零,那么可以得出两个版本号一样大。
4、实现
class Solution {
public:
int changeToInt(string s)
{
int a = 0;
for(int i = 0; i < s.size(); i++)
{
a = a * 10 + (s[i] - 48);
}
return a;
}
int compareVersion(string version1, string version2) {
int j = 0; int s1 = 0, s2 = 0;
for (int i = 0;; i++)
{
if (i == version1.size() || version1[i] == '.')
{
while (j < version2.size() && version2[j] != '.')
j++;
int a = changeToInt(version1.substr(s1, i - s1));
int b = changeToInt(version2.substr(s2, j - s2));
if (a > b)
return 1;
else if (a < b)
return -1;
s1 = i + 1; s2 = j + 1;
j++;
}
if (i >= version1.size())
{
if (j >= version2.size())
break;
while (j < version2.size() && version2[j] != '.')
j++;
if (changeToInt(version2.substr(s2, j - s2)) > 0)
return -1;
break;
}
if (j >= version2.size())
{
i++;
if (i >= version1.size())
break;
while (i < version1.size() && version1[i] != '.')
i++;
if (changeToInt(version1.substr(s1, i - s1)) > 0)
return 1;
break;
}
}
return 0;
}
};
5、反思
考虑问题不是很周全,首先是对版本号认识不准确,其次是没有考虑对比最后一部分,因为之前以’.’为判断条件,接着也没有考虑到长短不一的情况。编程序能力有待提高。对了,这次又用到了string库函数.
string substr(int pos = 0, int n = npos) const; //返回以pos开始的连续n个字符