JavaScript 字符串:比较版本号 【思路与知识点总结】

描述
一. 比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较忽略任何前导零后的整数值。比如"0.1"和"0.01"的版本号是相等的
二. 如果版本号没有指定某个下标处的修订号,则该修订号视为0。例如,“1.1"的版本号小于"1.1.1”。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1
三. version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0.
示例1
输入:“1.1”,“2.1”
返回值:-1
说明:version1 中下标为 0 的修订号是 “1”,version2 中下标为 0 的修订号是 “2” 。1 < 2,所以 version1 < version2,返回-1

示例2
输入:“1.1”,“1.01”
返回值:0
说明:version2忽略前导0,为"1.1",和version相同,返回0

示例3
输入:“1.1”,“1.1.1”
返回值:-1
说明:“1.1"的版本号小于"1.1.1”。因为"1.1"的版本号相当于"1.1.0",第3位修订号的下标为0,小于1,所以version1 < version2,返回-1

思路一:将两个版本号通过"."分割为数组,将较短的数组用0补齐。最后循环遍历比较数组的每一位的大小,大或小可直接返回最终答案。循环结束之后,若仍没返回结果,则返回相等即为0。

function compare( version1 ,  version2 ) {
    let arr1=version1.split(".");
    let arr2=version2.split(".");
    let length=Math.max(arr1.length,arr2.length);
    for (let i = 0; i < length; i++) {
        const n1 = Number(arr1[i]||0)
        const n2 = Number(arr2[i]||0)
        if (n1 > n2) return 1
        if (n1 < n2) return -1
    }
    return 0
}

总结:本题所用到的知识点
1. String对象中的方法 split()
split() 方法用于把一个字符串分割成字符串数组

stringObject.split(separator,howmany)

参数说明
(1)separator:必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
(2)如果把空字符串 (“”) 用作 separator,那么 stringObject 中的每个字符之间都会被分割。
(3)howmany:可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

2. Math对象中的max()方法
max() 方法可返回两个指定的数中带有较大的值的那个数。

Math.max(x...)

参数说明:
x:0 或多个值。在 ECMASCript v3 之前,该方法只有两个参数。
返回值:
参数中最大的值。如果没有参数,则返回 -Infinity。如果有某个参数为 NaN,或是不能转换成数字的非数字值,则返回 NaN。

3. JavaScript 全局对象中的Number()方法
Number() 函数把对象的值转换为数字。

Number(object)

如果参数是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。
如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。

4. || 或运算符
a || b :如果执行a后返回true,则整个表达式返回a的值,b不执行;
如果执行a后返回false,则执行b并返回b的值;

扩展:
a&& b :如果执行a后返回true,则执行b并返回b的值;
如果执行a后返回false,则整个表达式返回a的值,b不执行。

在js中以下内容会被当成false处理:“” , false , 0 , null , undefined , NaN ,
并且&& 优先级高于||

console.log(NaN>0)//false
console.log(NaN<0)//false
console.log(NaN==0)//false
console.log(NaN||0)//0
console.log(5||0)//5
console.log(0||5)//5

注意:本题关键——如何将长度较短的字符串数组用0补齐以及为什么
代码第6、7行

const n1 = Number(arr1[i]||0)
const n2 = Number(arr2[i]||0)

此题中第5行的循环条件i小于数组长度较大值。所以较短的数组在后面的循环中i会超过数组长度arr_[i]的值会为NaN。如果用NaN与较长数组相对应的值进行比较,则会认为既不大于也不小于(也就是等于),循环会继续进行,会导致错误。例如:1.0.1和1,这两个版本号就会判断错误,因为1这个版本号,并没有把它当成1.0.0,而是当成了1.0.1。

本题同思路的另一种写法:

function compare( version1 ,  version2 ) {
   var arr1 = version1.split('.').map(item => Number(item)),
       arr2 = version2.split('.').map(item => Number(item)),
       maxLen = Math.max(arr1.length, arr2.length);
   while(arr1.length < maxLen) arr1.push(0);
   while(arr2.length < maxLen) arr2.push(0);
   for (let i = 0; i < maxLen; i++) {
       if (arr1[i] > arr2[i]) return 1;
       if (arr1[i] < arr2[i]) return -1
   }
    return 0
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值