165.比較版本號
阿新 • • 發佈:2021-02-15
技術標籤:# 字串處理專題java字串leetcode演算法
165. 比較版本號
給你兩個版本號 version1
和 version2
,請你比較它們。
版本號由一個或多個修訂號組成,各修訂號由一個 '.'
連線。每個修訂號由 多位數字 組成,可能包含 前導零 。每個版本號至少包含一個字元。修訂號從左到右編號,下標從 0 開始,最左邊的修訂號下標為 0 ,下一個修訂號下標為 1 ,以此類推。例如,2.5.33
和 0.1
都是有效的版本號。
比較版本號時,請按從左到右的順序依次比較它們的修訂號。比較修訂號時,只需比較 忽略任何前導零後的整數值 。也就是說,修訂號 1
和修訂號 001
相等 。如果版本號沒有指定某個下標處的修訂號,則該修訂號視為 0
1.0
小於版本 1.1
,因為它們下標為 0
的修訂號相同,而下標為 1
的修訂號分別為 0
和 1
,0 < 1
。
返回規則如下:
- 如果
*version1* > *version2*
返回1
, - 如果
*version1* < *version2*
返回-1
, - 除此之外返回
0
。
示例 1:
輸入:version1 = "1.01", version2 = "1.001"
輸出:0
解釋:忽略前導零,"01" 和 "001" 都表示相同的整數 "1"
示例 2:
輸入:version1 = "1.0", version2 = "1.0.0" 輸出:0 解釋:version1 沒有指定下標為 2 的修訂號,即視為 "0"
示例 3:
輸入:version1 = "0.1", version2 = "1.1"
輸出:-1
解釋:version1 中下標為 0 的修訂號是 "0",version2 中下標為 0 的修訂號是 "1" 。0 < 1,所以 version1 < version2
示例 4:
輸入:version1 = "1.0.1", version2 = "1"
輸出:1
示例 5:
輸入:version1 = "7.5.2.4", version2 = "7.5.3" 輸出:-1
提示:
1 <= version1.length, version2.length <= 500
version1
和version2
僅包含數字和'.'
version1
和version2
都是 有效版本號version1
和version2
的所有修訂號都可以儲存在 32 位整數 中
思路:
由於給出的引數僅包含數字和'.'
,故我們可以從前往後比較以'.'
分隔的數字即可。不夠的版本則用0
代替。
這裡我們需要用到字串處理問題中的一個最最最常見的技巧,如下,用於找到符合某要求的子串的索引區間。
如這裡就是找到用'.'
分隔的每個數字的區間為[i,x)
int x = i;
while(x < version1.length() && version1.charAt(x) != '.') x++;
Java程式碼
class Solution {
public int compareVersion(String version1, String version2) {
int i = 0,j = 0;
//只要還有至少一個字串沒有遍歷結束,則仍可繼續往後比較
while(i < version1.length() || j < version2.length()){
int x = i,y = j;
//找到兩個字串下標相同的修訂號並進行比較
while(x < version1.length() && version1.charAt(x) != '.') x++;
while(y < version2.length() && version2.charAt(y) != '.') y++;
//若版本號沒有指定某個下標處的修訂號,則該修訂號視為0
int a = x == i ? 0 : Integer.valueOf(version1.substring(i,x));
int b = y == j ? 0 : Integer.valueOf(version2.substring(j,y));
if(a > b) return 1;
if(a < b) return -1;
//繼續往後,比較後面的修訂號
i = x + 1;
j = y + 1;
}
return 0;
}
}