开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
引言
算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。
题目描述
给你两个版本号 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
分析
根据题目的分析,我们知道题目需要完成版本号的比较。根据题目设计的规则,我们可以对版本号字符串先完成分割,然后逐个的对比两个字符串数组的大小完成判断
- 将两个字符串安装.分割成两个字符串数组
- 设置两个指针i,j分别指向两个数组的开始位置
- 循环的判断两个字符串数组的大小,并同步的移动位置
- 如果存在一个数组长度长,则继续遍历这个数组的大小判断
- 返回结果
解答
var compareVersion = function(version1, version2) {
//比较版本号码
let arr1 = version1.split(".")
let arr2 = version2.split(".")
let min = Math.min(arr1.length,arr2.length)
for(let i=0;i<min;i++) {
if(Number(arr1[i])>Number(arr2[i])) return 1
else if(Number(arr1[i])<Number(arr2[i])) return -1
}
if(arr1.length===min) {
for(let i=min;i<arr2.length;i++) if(Number(arr2[i])!==0) return -1
}
if(arr2.length===min) {
for(let i=min;i<arr1.length;i++) if(Number(arr1[i])!==0) return 1
}
return 0
};
由于设计是双指针,通过分析知:算法的时间复杂度是o(n)。空间复杂度是o(n)。整体设计思路还是比较简洁容易的。
总结
通过对版本号比较题目的讲解,大家学到了如何利用双指针进行问题的解决。双指针的巧妙计算可以优雅的在低时间和空间复杂度下完成任务。