手撕-版本号排序
题目
-
输入一组版本号,输出从大到小的排序
-
示例:
输入:['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
});
};
浙公网安备 33010602011771号