1. 程式人生 > >【LeetCode】165. 比較版本號 (C++)

【LeetCode】165. 比較版本號 (C++)

題目描述:

比較兩個版本號 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;
    }
};