javascript - 尽可能以最简单和最简洁的方式
问题描述
我想在不使用 sort() 的情况下按升序或降序对数组值进行排序。
我创建了一个函数,但我对它不满意。我相信下面的代码可能会更短更简洁。
请让我知道在哪里修改,或者您也可以完全更改代码。先感谢您。
const func = arg => {
let flip = false;
let copy = [];
for(let val of arg) copy[copy.length] = val;
for(let i=0; i<arg.length; i++) {
const previous = arg[i-1];
const current = arg[i];
if(previous > current) {
flip = true;
copy[i] = previous;
copy[i-1] = current;
}
}
if(flip) return func(copy);
return copy;
};
l(func([5,2,8,1,9,4,7,3,6]));
解决方案
如果您的输入由整数组成,如示例中所示,pne 选项是将数组简化为一个对象,其键是数字,其值是这些值到目前为止出现的次数。然后,迭代对象(其Object.entries
将按数字键升序进行迭代,对于整数键),并创建要返回的数组:
const func = arr => {
const valuesObj = {};
arr.forEach((num) => {
valuesObj[num] = (valuesObj[num] || 0) + 1;
});
return Object.entries(valuesObj)
.flatMap(
([num, count]) => Array(count).fill(num)
);
};
console.log(
func([5,2,8,1,9,10,10,11,4,7,3,6])
);
这是O(N)
及时的。
为了在保持运行时同时考虑负整数,O(N)
请为负数创建另一个对象:
const func = arr => {
const valuesObj = {};
const negativeValuesObj = {};
arr.forEach((num) => {
if (num >= 0) valuesObj[num] = (valuesObj[num] || 0) + 1;
else negativeValuesObj[-num] = (negativeValuesObj[-num] || 0) + 1;
});
return [
...Object.entries(negativeValuesObj).reverse()
.flatMap(
([num, count]) => Array(count).fill(-num)
),
...Object.entries(valuesObj)
.flatMap(
([num, count]) => Array(count).fill(num)
)
];
};
console.log(
func([5,2,8,1,-5, -1, 9,10,10,11,4,7,3,6, -10])
);
对于非整数项,您必须使用具有更高计算复杂度的不同算法。
推荐阅读
- javascript - 如果 3 列中的任何日期 = 今天,Google Sheets Appscript 发送电子邮件
- compression - 可以从自制软件中获得压缩吗?
- bash - 跳过 sed 中的模式
- javascript - “DateTimeFormat”类型上不存在属性“formatToParts”
- java - 无法在我的类中使用 onBindViewHolder 实现扩展 RecyclerView.Adapter
- centos - 如何删除:rpmdb failed release 提供
- python - 你如何在 PYplot 中设置起点?
- javascript - 一切正常,但按钮永远不会启用
- rest - 是否有任何用于创建和测试 WSO2 REST API 的文档
- hive - Hive-查询输出到文件 csv/excel