【问题标题】:in the easiest and most concise way as possible尽可能以最简单和最简洁的方式
【发布时间】:2019-12-02 01:40:13
【问题描述】:

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

【问题讨论】:

  • 不清楚您的目标是什么。听起来您想要更短的代码;大多数人想要更高效的代码。这是当前的 n^2 算法。所以它肯定会更有效率。
  • 请编辑标题以反映更具体的问题。
  • 你能告诉我们你为什么不想使用sort吗?

标签: javascript methods


【解决方案1】:

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

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

【讨论】:

  • 应该是integer keys——“数字键”表示它包含浮点数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2012-05-03
相关资源
最近更新 更多