java
主页 > 软件编程 > java >

Go Java算法之比较版本号方法

2022-08-10 | 秩名 | 点击:

比较版本号

给你两个版本号 version1 和 version2 ,请你比较它们。

返回规则如下:

如果 version1 > version2 返回 1,

如果 version1 < version2 返回 -1,

除此之外返回 0。  

输入:version1 = "1.01", version2 = "1.001"

输出:0

解释:忽略前导零,"01" 和 "001" 都表示相同的整数 "1"

输入:version1 = "1.0", version2 = "1.0.0"

输出:0

解释:version1 没有指定下标为 2 的修订号,即视为 "0"

输入: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 位整数

方法一:字符串切割(Java)

我们可以将版本号按照点号分割成修订号,然后从左到右比较两个版本号的相同下标的修订号。在比较修订号时,需要将字符串转换成整数进行比较。

通过调用Java的标准库即可实现字符串切割

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

class Solution {

    public int compareVersion(String version1, String version2) {

        String[] v1 = version1.split("\\.");

        String[] v2 = version2.split("\\.");

        for (int i = 0; i < v1.length || i < v2.length; ++i) {

            int x = 0, y = 0;

            if (i < v1.length) {

                x = Integer.parseInt(v1[i]);

            }

            if (i < v2.length) {

                y = Integer.parseInt(v2[i]);

            }

            if (x > y) {

                return 1;

            }

            if (x < y) {

                return -1;

            }

        }

        return 0;

    }

}

时间复杂度:O(m+n)

空间复杂度:O(m+n)

方法二:双指针(Go)

方法一需要存储分割后的修订号,为了优化空间复杂度,我们可以在分割版本号的同时解析出修订号进行比较。

比较两个版本号大小,版本号由修订号组成,中间使用'.'分隔,越靠近字符串前边,修订号的优先级越大。当v1 > v2时返回 1,当v1 < v2时返回 -1,相等时返回 0。

我们使用两个指针i和j分别指向两个字符串的开头,然后向后遍历,当遇到小数点'.'时停下来,并将每个小数点'.'分隔开的修订号解析成数字进行比较,越靠近前边,修订号的优先级越大。根据修订号大小关系,返回相应的数值。

算法具体流程:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

func compareVersion(version1, version2 string) int {

    n, m := len(version1), len(version2)

    i, j := 0, 0

    for i < n || j < m {

        x := 0

        for ; i < n && version1[i] != '.'; i++ {

            x = x*10 + int(version1[i]-'0')

        }

        i++ // 跳过点号

        y := 0

        for ; j < m && version2[j] != '.'; j++ {

            y = y*10 + int(version2[j]-'0')

        }

        j++ // 跳过点号

        if x > y {

            return 1

        }

        if x < y {

            return -1

        }

    }

    return 0

}

时间复杂度:O(m+n)

空间复杂度:O(1)

原文链接:https://juejin.cn/post/7129901714341101598
相关文章
最新更新