手撕-版本号排序

题目

  • 输入一组版本号,输出从大到小的排序

  • 示例:
    输入:['2.1.0.1', '0.402.1', '10.2.1', '5.1.2', '1.0.4.5']
    输出: ['10.2.1', '5.1.2', '2.1.0.1', '1.0.4.5', '0.402.1']

法一、字符串转数字比较

function versionSort(arr) {
    return arr.sort((a, b) => {
        // 将版本号字符串分割成数字数组'0.402.1'->[0,402,1]
        const partsA = a.split('.').map(Number);
        const partsB = b.split('.').map(Number);
        // 比较每一个部分
        for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {
            // 获取当前部分的值,如果超出长度则默认为 0
            const partA = partsA[i] || 0;//[1,0,5]
            const partB = partsB[i] || 0;//[1,0]->[1,0,0]
            // 比较当前部分
            if (partA !== partB) {
                return partB - partA; //降序:若partB>partA,则partB-partA为正值,这意味着partB应该排在partA前面;反之排后面
            }
        }
        // 如果所有部分都相等,返回 0
        return 0;
    });
}

法二、双指针

var versionSort = function (arr) {
    // 使用 sort 方法对数组进行排序
    return arr.sort((a, b) => {
        const n = a.length, m = b.length; // 获取两个版本号的长度
        let i = 0, j = 0; // 初始化指针 i 和 j

        // 遍历两个版本号的每一部分
        while (i < n || j < m) {
            let x = 0; // 用于存储版本号 a 的当前部分数值
            let y = 0; // 用于存储版本号 b 的当前部分数值

            // 提取版本号 a 的当前部分
            for (; i < n && a[i] !== '.'; i++) {
                x = x * 10 + (+a[i]); // 累加数字
            }
            i++; // 跳过 '.'

            // 提取版本号 b 的当前部分
            for (; j < m && b[j] !== '.'; j++) {
                y = y * 10 + (+b[j]); // 累加数字
            }
            j++; // 跳过 '.'

            // 比较当前部分的值
            if (x !== y) {
                return y - x; // 若y>x,则y-x为正值,这意味着 y应该排在x前面;若y<x,则y-x为负值,这意味着x应该排在y前面
            }
        }
        return 0; // 如果所有部分都相等,返回 0
    });
};
posted @   Frommoon  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2024-03-03 147. 对链表进行插入排序(中)
点击右上角即可分享
微信分享提示