首页 > 解决方案 > 尽可能以最简单和最简洁的方式

问题描述

我想在不使用 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]));

标签: javascriptmethods

解决方案


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

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


推荐阅读