对于单调递减的数字,由于它们的每一位数字都是递减的,因此当位数相同时,数字越小意味着它们的值越小。所以我们可以先按位数从小到大分类,然后对于每个位数中的数字,按照数值从小到大排序,最后将它们合并成一个数组。
以下是具体的实现过程:
1. 定义一个嵌套数组,用来按位数分类存储单调递减的数字。
const nums = [[], [], [], [], [], [], [], [], []]; // 最多有九位数
2. 将单调递减的数字按位数分类存储在 nums 数组中。
const input = [1, 2, 3, 321, 876];
for (let num of input) {
const len = num.toString().length;
nums[len - 1].push(num); // 将数字存储在对应的数组中
}
3. 对于每个位数中的数字,按照数值从小到大排序。
nums.forEach((arr) => arr.sort((a, b) => a - b));
4. 将所有分类好的数字合并成一个数组。
const result = nums.flat();
最终得到的 result 数组即为按照从小到大排序后的单调递减数字。
完整的代码示例如下:
const nums = [[], [], [], [], [], [], [], [], []]; // 最多有九位数
const input = [1, 2, 3, 321, 876];
for (let num of input) {
const len = num.toString().length;
nums[len - 1].push(num); // 将数字存储在对应的数组中
}
nums.forEach((arr) => arr.sort((a, b) => a - b)); // 按值从小到大排序
const result = nums.flat(); // 将所有数组合并成一个数组
console.log(result); // [1, 2, 3, 321, 876]
注意,虽然单调递减的数字是有限的,但它们的位数可能非常大,如果输入的数字范围很大,那么上述代码可能会出现性能问题。需要进一步优化算法或使用更高效的数据结构来处理。
如果问题已经解决,请设置最佳答案 |