手撕-版本号排序
题目
-
输入一组版本号,输出从大到小的排序
-
示例:
输入:['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
});
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2024-03-03 147. 对链表进行插入排序(中)