比较版本号
LeetCode题目链接:https://leetcode.cn/problems/compare-version-numbers/
难度:中等
分析
思路
直接通过.
切分字符串,遍历数组,直接使用内置函数将字符串转为数字进行比较,如果相等就继续比较,如果不等就直接返回结果
对于版本号长度不等的情况,只需将缺少的项视为0然后正常进行比较就行
点我展开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public int compareVersion(String version1, String version2) { String[] arr1 = version1.split("\\."); String[] arr2 = version2.split("\\."); int ret = 0; for (int i = 0;i < Math.max(arr1.length, arr2.length);i++) { int x = 0; int y = 0; if (i < arr1.length) { x = Integer.parseInt(arr1[i]); } if (i < arr2.length) { y = Integer.parseInt(arr2[i]); } if (x != y) { ret = x > y ? 1 : -1; break; } }
return ret; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| func compareVersion(version1 string, version2 string) int { var ( slice1 = strings.Split(version1, ".") slice2 = strings.Split(version2, ".") ) for i := 0;i < len(slice1) || i < len(slice2);i++ { x := 0 y := 0
if i < len(slice1) { x, _ = strconv.Atoi(slice1[i]) }
if i < len(slice2) { y, _ = strconv.Atoi(slice2[i]) }
if x > y { return 1 } if x < y { return -1 } }
return 0 }
|
优化
采用.
切分字符串需要使用数组来保存切分的结果来遍历
可以使用双指针 直接遍历字符串进行比较
点我展开
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| class Solution { public int compareVersion(String version1, String version2) { int i = 0; int j = 0; while (i < version1.length() || j < version2.length()) { int x = 0; int y = 0;
while(i < version1.length()) { if (version1.charAt(i) == '.') { i++; break; } x = 10 * x + version1.charAt(i) - '0'; i++; }
while(j < version2.length()) { if (version2.charAt(j) == '.') { j++; break; } y = 10 * y + version2.charAt(j) - '0'; j++; }
if (x > y) { return 1; } if (x < y) { return -1; } }
return 0; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| func compareVersion(version1 string, version2 string) int { var ( i = 0 j = 0 )
for ;i < len(version1) || j < len(version2); { var ( x = 0 y = 0 ) for ;i < len(version1) && version1[i] != '.';i++ { x = 10 * x + int(version1[i] - '0') } i++; for ;j < len(version2) && version2[j] != '.';j++ { y = 10 * y + int(version2[j] - '0') } j++;
if x > y { return 1 } if x < y { return -1 } } return 0 }
|
拓展
根据国际主流的惯例,我们使用「语义化版本(Semantic Versioning)」的命名方式,有时简称 SemVer。语义化版本号(以下简称「版本号」)的格式是:<major>.<minor>.<patch>
。即使用三位非负整数,以点号.
连接。
<major>
即主版本号,俗称大版本升级。改动到主版本号时,标志着 API 发生了巨大变化,包括但不限于新增特性、修改机制、删除功能, 一般不兼容上一个主版本号。
<minor>
即次版本号,俗称小版本升级。当我们进行常规的新增或修改功能时,改动次版本号,但是必须是向前兼容的。这也意味着我们不能直接删除某个功能。如若必要,我们可以在修改日志中标记某项功能为「即将删除(Deprecated)」,然后在下一个大版本中将其彻底删除。
<patch>
即修订号,俗称 bug 修复。顾名思义,如果仅仅为了修复或调整一些小问题,我们就只改动修订号。
参考文章:https://blog.csdn.net/qq_35246620/article/details/78443169
实际开发中,有时也会给版本号后添加-<6位commitID>
唯一标识某个版本的提交