力扣165(java)-比較版本號(中等)
題目:
給你兩個版本號 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
提示:
- 1 <= version1.length, version2.length <= 500
- version1 和 version2 僅包含數字和 '.'
- version1 和 version2 都是 有效版本號
- version1 和 version2 的所有修訂號都可以儲存在 32 位整數 中
來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/compare-version-numbers
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解題思路:
一、字串分割
1.首先將版本號字串以 . 為分割符進行分割成字串陣列v1和v2;
2.從左到右依次遍歷版本號,並將其轉換為整數再進行比較兩個版本號相同下標的版本號;
3.如果v1 > v2,則返回 1;如果v1 < v2,則返回 -1; 其他就返回 0。
程式碼:
二、雙指標
1.定義兩個指標並初始化為0;
2.指標遍歷字串,遇到 "." 結束本輪迴圈,將遍歷到字元數字轉換成十進位制數,並進行比較;
3.指標後移,目的是跳過 ".",再進行下一輪迴圈遍歷轉換成十進位制數,進行比較;
4.遍歷完兩個字串後,沒有返回相應的結果,就說明兩個版本號相等,返回0。
程式碼:
1 class Solution { 2 public int compareVersion(String version1, String version2) { 3 int n = version1.length(), m = version2.length(); 4 //定義並初始化兩個指標 5 int i = 0, j = 0; 6 while(i < n || j < m){ 7 int a = 0, b = 0; 8 //獲取當前索引下的數字進行比較 9 while(i < n && version1.charAt(i) != '.'){ 10 //跳過前導0,將字串數字轉換成十進位制數 11 a = a * 10 + version1.charAt(i) - '0'; 12 i++; 13 } 14 while(j < m && version2.charAt(j) != '.'){ 15 b = b * 10 + version2.charAt(j) - '0'; 16 j++; 17 } 18 if(a != b) 19 return a >b ? 1 : -1; 20 //跳過 . 號 21 i++; 22 j++; 23 } 24 return 0; 25 } 26 }
小知識:
1.Java的parseInt方法可以解析前導零提供的十進位制值,不會丟擲異常,會剝離零。
int value = Integer.parseInt("050", 10); //將導致整數值50.
2.for 和 while的使用:
- 知道執行次數的時候一般用for,條件迴圈時一般用while;
- 如果每輪迴圈都是在迴圈處理完後才進行迴圈變數增加的話,使用for迴圈比較方便,如果迴圈處理的過程中就要將迴圈變數增加時,則使用while迴圈比較方便;
- for迴圈可以設定次數,while迴圈條件滿足沒有次數限制(for迴圈適合已知迴圈次數的操作,while迴圈適合未知迴圈次數的操作)。
3.a = a * 10 + version1.charAt(i) - '0' :將字元數字轉換成十進位制數字
- version1.charAt(i) - '0' : 將字元數字轉換成整型數字,假設當前字元陣列為1,則char值為49,即 49-48= 1,為1真正的數字值
- a = a * 10 + version1.charAt(i) - '0' 轉換成十進位制數字,例如169
- a = 0*10+1 = 1;
- a = 1*10+6 = 16;
- a = 16*10+9 = 169