原题地址:https://leetcode-cn.com/submissions/detail/8372357/
题目描述:
比较两个版本号 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。
你可以假设版本字符串非空,并且只包含数字和 . 字符。
. 字符不代表小数点,而是用于分隔数字序列。
例如,2.5 不是“两个半”,也不是“差一半到三”,而是第二版中的第五个小版本。
示例 1:
输入: version1 = "0.1", version2 = "1.1"
输出: -1
示例 2:
输入: version1 = "1.0.1", version2 = "1"
输出: 1
示例 3:
输入: version1 = "7.5.2.4", version2 = "7.5.3"
输出: -1
解题方案:
解题需要做的就是判断点的情况。然后出错的原因就是判断与“0”比较,因为字符串的比较是按字典序的,所以要转成整型进行比较。虽然时间复杂度还可以,但是觉得代码冗余的太多了,应该还有很多地方可以做一些简化。不过没有时间和心情改了emmmm
代码:
class Solution {
public:
int compareVersion(string version1, string version2) {
int l1 = version1.length();
int l2 = version2.length();
if(l1 == 0 && l2 == 0)
return 0;
else if(l1 == 0 && l2 != 0)
{
if(version2 != "0")
return -1;
else
return 0;
}
else if(l1 != 0 && l2 == 0)
{
if(version1 != "0")
return 1;
else
return 0;
}
while(version1.length() != 0 && version2.length() != 0)
{
int p1 = version1.find('.');
int p2 = version2.find('.');
if(p1 == string::npos && p2 == string::npos)//都没有点
return strcm(version1, version2);
else if(p1 != string::npos && p2 != string::npos)//都有点
{
string s1 = version1.substr(0, p1);
string s2 = version2.substr(0, p2);
if(strcm(s1, s2) != 0)
return strcm(s1, s2);
else//点前面的部分相同
{
if(p1!= l1 - 1 && p2!= l2 - 1)
{
version1 = version1.substr(p1 + 1);
version2 = version2.substr(p2 + 1);
}
else if(p1 == l1 - 1 && p2 == l2 - 1)
return 0;
else//一个.是最后一个,另一个不是
{
if(p1 == l1 - 1)
{
string ss2 = version2.substr(p2 + 1);
int pp2 = ss2.find('.');
while(pp2 != string::npos)
{
if(ss2.substr(0, pp2) != "0")
return -1;
else
{
if(pp2 != ss2.length() - 1)
{
ss2 = ss2.substr(pp2 + 1);
pp2 = ss2.find('.');
}
else
return 0;
}
}
return strcm("0", ss2);
}
else
{
string ss1 = version1.substr(p1 + 1);
int pp1 = ss1.find('.');
while(pp1 != string::npos)
{
if(ss1.substr(0, pp1) != "0")
return 1;
else
{
if(pp1 != ss1.length() - 1)
{
ss1 = ss1.substr(pp1 + 1);
pp1 = ss1.find('.');
}
}
}
return strcm(ss1, "0");
}
}
}
}
else//一个有点一个没点
{
if(p1 != string::npos)
{
int pp1 = version1.find('.');
int x = strcm(version1.substr(0, pp1), version2);
if(x != 0)
return x;
version1 = version1.substr(pp1 + 1);
pp1 = version1.find('.');
if(pp1 == string::npos)
{
if(version1 != "0")
return 1;
else
return 0;
}
while(pp1 != string::npos)
{
if(version1.substr(0, pp1) != "0")
return 1;
else
{
if(pp1 != version1.length() - 1)
{
version1 = version1.substr(pp1 + 1);
pp1 = version1.find('.');
}
else
return 0;
}
}
return strcm(version1, "0");
}
else
{
int pp2 = version2.find('.');
int x = strcm(version1, version2.substr(0, pp2));
if(x != 0)
return x;
version2 = version2.substr(pp2 + 1);
pp2 = version2.find('.');
if(pp2 == string::npos)
{
if(version2 != "0")
return -1;
else
return 0;
}
pp2 = version2.find('.');
while(pp2 != string::npos)
{
if(version2.substr(0, pp2) != "0")
return -1;
else
{
if(pp2 != version2.length() - 1)
{
version2 = version2.substr(pp2 + 1);
pp2 = version2.find('.');
}
else
return 0;
}
}
return strcm("0", version2);
}
}
}
}
int strcm(string s1, string s2)
{
stringstream ss1;
ss1 << s1;
int a1;
ss1 >> a1;
stringstream ss2;
ss2 << s2;
int a2;
ss2 >> a2;
if(a1 > a2)
return 1;
else if(a1 < a2)
return -1;
else
return 0;
}
};