比較兩個版本號 version1 和 version2。
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。
你可以假設版本字符串非空,並且只包含數字和 . 字符。
. 字符不代表小數點,而是用於分隔數字序列。
例如,2.5 不是“兩個半”,也不是“差一半到三”,而是第二版中的第五個小版本。
你可以假設版本號的每一級的默認修訂版號爲 0。例如,版本號 3.4 的第一級(大版本)和第二級(小版本)修訂號分別爲 3 和 4。其第三級和第四級修訂號均爲 0。
示例 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
示例 4:輸入:version1 = "1.01", version2 = "1.001"
輸出:0
解釋:忽略前導零,“01” 和 “001” 表示相同的數字 “1”。
示例 5:輸入:version1 = "1.0", version2 = "1.0.0"
輸出:0
解釋:version1 沒有第三級修訂號,這意味着它的第三級修訂號默認爲 “0”。
提示:
版本字符串由以點 (.) 分隔的數字字符串組成。這個數字字符串可能有前導零。
版本字符串不以點開始或結束,並且其中不會有兩個連續的點。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/compare-version-numbers
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
題解:
class Solution {
public int compareVersion(String version1, String version2) {
//每次取兩個.之間的數字比較版本
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
//方便比較,首先給每個數字末尾加上"."
//這樣在取數就不需要判斷當前是否已經到達字符串尾部
s1.append(version1);
s1.append(".");
s2.append(version2);
s2.append(".");
int start1 = 0, start2 = 0;
int index1 = s1.indexOf(".");
int index2 = s2.indexOf(".");
while(index1!=-1 && index2!=-1){
int num1 = Integer.parseInt(s1.substring(start1,index1));
int num2 = Integer.parseInt(s2.substring(start2,index2));
if(num1 != num2){
return num1>num2?1:-1;
}else{
//迭代處理起點和截取段
start1 = index1+1;
index1 = s1.indexOf(".",index1+1);
start2 = index2+1;
index2 = s2.indexOf(".",index2+1);
}
}
// System.out.println(index1 + " " +index2 +" "+ s1 +" "+ s2);
if(index1 != -1 || index2 != -1){
if(index1 == -1){
//用last_start做起點開始檢測,簡化認爲出現非0非.則一定是非0數字
for(int i=start2 ; i<s2.length() ; i++){
if(s2.charAt(i)!='.' && s2.charAt(i)!='0'){
return -1;
}
}
}else{
for(int i=start1 ; i<s1.length() ; i++){
if(s1.charAt(i)!='.' && s1.charAt(i)!='0'){
return 1;
}
}
}
}
return 0;
}
}