美文网首页
算法练习06 版本号排序

算法练习06 版本号排序

作者: 多啦斯基周 | 来源:发表于2018-11-21 09:59 被阅读0次

    题目(2018-11-21)

    有一个项目,由于多人维护,导致版本号规则,例如:

    const version = ['1.45.0', '1.5', '6', '3.3.3.3.3']
    

    现在需要对版本号进行从小到大排序,注意: 1.45.0是大于1.5

    实现

    直接用sort函数比较是不行的,sort函数在比较字符串的时候,是比较字符串的Unicode进行排序的:

    '1' < '2'; // true
    '1' < '10'; // false
    

    显然是行不通的

    我的思路是,先将version数组成员通过split('.')拆分成一个个数组

    const version = ['1.45.0', '1.5', '6', '3.3.3.3.3'];
    const temp = [[1, 45, 0], [1, 5], [6], [3, 3, 3]]
    

    在排序的过程中,分为两层,外层的核心是利用选择排序,选择排序过程中进行数值比较时,比较的成员仍然是两个数组:

    const a = [1, 45, 0],
      b = [1, 5];
    

    这时候再加一层循环,用a[k]去比较b[k],比较只要能比较出大小(不等)就结束这一层循环,如果相等就继续

    一开始结果总不对,结果发现是忘了处理一种情况,比如:a[k] > b[k]是我们要交换位置的条件,这时候要结束内层循环,但是a[k] < b[k]同样要结束循环,只不过不交换位置,否则循环继续就违背了版本号比较的初衷了

    代码上,首先来复习一下选择排序

    const chooseSort = arr = > {
      for (let i = 0; i < arr.length; i++) {
        // 选定首位为最小值
        let minIndex = i;
        for (let j = i; j < arr.length; j++) {
          // 比较时如果当前项更小,增更新最小值序号
          if (arr[j] < arr[minIndex]) {
            minIndex = j
          }
        }
        // 将最小值排到这一轮循环的首位
        [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
      }
      return arr;
    };
    

    经过上面的解释,我们现在的关键就是将:

    if (arr[j] < arr[minIndex]) {
      minIndex = j
    }
    

    由直接比较替换为:

    for (let k = 0; k < temp[j].length; k++) {
      if (arr[j][k] < arr[minIndex][k]) {
        minIndex = j
      }
      // 只要不等,就立刻结束最内层遍历
      if (arr[j][k] !== arr[minIndex][k]) {
        break!
      }
    }
    

    最终的代码:

    // 使用的是选择排序
    const versionSort = version => {
      const temp = version.map(v => v.split('.'));
      for (let i = 0; i < temp.length; i++) {
        let minIndex = i;
        for (let j = i; j < temp.length; j++) {
          for (let k = 0; k < temp[j].length; k++) {
            const current = +temp[j][k],
            min = +temp[minIndex][k];
            if (current < min) {
              minIndex = j;
            }
            // 只要不等,就立刻结束最内层遍历!
            if (current !== min) {
              break
            }
          }
        }
        [temp[i], temp[minIndex]] = [temp[minIndex], temp[i]];
      }
      return temp.map(v = > v.join('.'))
    };
    
    const version1 = ['1.45.0', '1.5', '6', '3.3.3.3.3'];
    console.log(versionSort(version1));
    // ["1.5", "1.45.0", "3.3.3.3.3", "6"]
    
    const version2 = ['0.1.1', '2.3.3', '0.3002.1', '4.2', '4.3.5', '4.3.4.5'];
    console.log(versionSort(version2));
    // ["0.1.1", "0.3002.1", "2.3.3", "4.2", "4.3.4.5", "4.3.5"]
    

    本人水平有限,如果代码有误或者更好的思路,希望赐教。

    参考

    相关文章

      网友评论

          本文标题:算法练习06 版本号排序

          本文链接:https://www.haomeiwen.com/subject/ofsqqqtx.html