1. 程式人生 > 其它 >力扣165(java)-比較版本號(中等)

力扣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