共计 974 个字符,预计需要花费 3 分钟才能阅读完成。
遇到这样一个题:实现一个函数,求数组中所有数字可拼出的最大整数。举例:
maxNum([0, 4, 19, 41, 70]) // 70441190
maxNum([3, 30, 34, 5, 9]) // 9534330
maxNum([539, 53]) // 53953
maxNum([]) // 0
这个题目实际上是对数组进行排序,排序的规定是让最大的数字排在高位,比方:70 和 41 比拟,7 大于 4,所以 70 应该放在 41 前;然而有非凡状况,如果两个数字前几位都雷同该怎么办,比方 539 和 53,5 和 3 都雷同,此时应该用 539 中的 9 和 53 的第一位 5 比拟,9 大于 5,所以 539 应该放在后面。
实现的步骤为:
- 将数字转为字符串,顺次比拟两个数字的每一位,将高位更大的数字排在后面;
- 如果两个数字 a, b 的长度别离为 n 和 n+m,且前 n 位都雷同,那么用 a[0] 和 b[n] 进行比拟;
代码如下:
function maxNum(arr) {function sortFn(num1, num2) {num1 = `${num1}`;
num2 = `${num2}`;
let num1Len = num1.length;
let num2Len = num2.length;
let num1Index = 0;
let num2Index = 0;
while (1) {if (num1[num1Index] === num2[num2Index]) {
num1Index++;
num2Index++;
// num1 已遍历完结,num2 未完结
if (num1Index === num1Len && num2Index < num2Len) {return +num2[num2Index] - (+num1[0]);
}
// num2 已遍历完结,num1 未完结
if (num2Index === num2Len && num1Index < num1Len) {return +num2[0] - (+num1[num1Index]);
}
// num1 和 num2 都已遍历完结
if (num1Index === num2Len && num2Index === num2Len) {return +num2[num2Index] - (+num1[num1Index]);
}
} else {return +num2[num2Index] - (+num1[num1Index]);
}
}
}
return +arr.sort(sortFn).join('');
}
正文完
发表至: javascript
2021-09-05