【LeetCode】165. 比較版本號 (C++)
阿新 • • 發佈:2018-12-15
題目描述:
比較兩個版本號 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; } };