为了账号安全,请及时绑定邮箱和手机立即绑定

尽可能以最简单、最简洁的方式

尽可能以最简单、最简洁的方式

长风秋雁 2021-08-20 10:07:38
我想在不使用 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]));
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

如果您的输入由整数组成,如示例中所示, 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])

);

对于非整数项,您必须使用具有更高计算复杂度的不同算法。


查看完整回答
反对 回复 2021-08-20
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信