1. 程式人生 > 實用技巧 >0165. Compare Version Numbers (M)

0165. Compare Version Numbers (M)

Compare Version Numbers (M)

題目

Compare two version numbers version1 and version2.
If version1 > version2 return 1; if version1 < version2 return -1;otherwise return 0.

You may assume that the version strings are non-empty and contain only digits and the . character.

The . character does not represent a decimal point and is used to separate number sequences.

For instance, 2.5 is not "two and a half" or "half way to version three", it is the fifth second-level revision of the second first-level revision.

You may assume the default revision number for each level of a version number to be 0. For example, version number 3.4 has a revision number of 3

and 4 for its first and second level revision number. Its third and fourth level revision number are both 0.

Example 1:

Input: version1 = "0.1", version2 = "1.1"
Output: -1

Example 2:

Input: version1 = "1.0.1", version2 = "1"
Output: 1

Example 3:

Input: version1 = "7.5.2.4", version2 = "7.5.3"
Output: -1

Example 4:

Input: version1 = "1.01", version2 = "1.001"
Output: 0
Explanation: Ignoring leading zeroes, both “01” and “001" represent the same number “1”

Example 5:

Input: version1 = "1.0", version2 = "1.0.0"
Output: 0
Explanation: The first version number does not have a third level revision number, which means its third level revision number is default to "0"

Note:

  1. Version strings are composed of numeric strings separated by dots . and this numeric strings may have leading zeroes.
  2. Version strings do not start or end with dots, and they will not be two consecutive dots.

題意

比較兩個版本號的大小。

思路

比較方便的是先以"."為分隔符將字串拆成一個字串陣列,再挨個比較每一個字串代表的數字大小。

當然也可以不用java內建的api實現,直接遍歷字串計算每一層級版本對應的數字。


程式碼實現

Java

split

class Solution {
    public int compareVersion(String version1, String version2) {
        // 注意正則需要用"\\."來匹配"."
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");
        int i = 0;

        while (i < v1.length || i < v2.length) {
            // 長度不夠則當前對應數字為0
            int x = i < v1.length ? Integer.parseInt(v1[i]) : 0;
            int y = i < v2.length ? Integer.parseInt(v2[i]) : 0;

            if (x < y) return -1;
            if (x > y) return 1;

            i++;
        }
        
        return 0;
    }
}

遍歷

class Solution {
    public int compareVersion(String version1, String version2) {
        int i = 0, j = 0;
        while (i < version1.length() || j < version2.length()) {
            int x = 0, y = 0;		// 長度不夠時則為預設值0
            
            while (i < version1.length() && version1.charAt(i) != '.') {
                x = x * 10 + version1.charAt(i++) - '0';
            }
            i++;		// 移動到"."後一位數字
            while (j < version2.length() && version2.charAt(j) != '.') {
                y = y * 10 + version2.charAt(j++) - '0';
            }
            j++;		// 移動到"."後一位數字

            if (x < y) return -1;
            if (x > y) return 1;
        }
        return 0;
    }
}

JavaScript

/**
 * @param {string} version1
 * @param {string} version2
 * @return {number}
 */
var compareVersion = function (version1, version2) {
  let v1 = version1.split('.').map(v => parseInt(v))
  let v2 = version2.split('.').map(v => parseInt(v))
  let i = 0
  while (i < v1.length || i < v2.length) {
    let a = i < v1.length ? v1[i] : 0
    let b = i < v2.length ? v2[i] : 0
    if (a !== b) {
      return a < b ? -1 : 1
    }
    i++
  }
  return 0
}