目录
- 题目
- 法一、字符串转数字比较
- 法二、双指针
题目
-
输入一组版本号,输出从大到小的排序
-
示例:
输入:['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++) {// 获取当前部分的值,如果超出长度则默认为 0const 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前面;反之排后面}}// 如果所有部分都相等,返回 0return 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});
};