【LeetCode】165. 比较版本号 (C++)

原题地址: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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值