【问题标题】:Given an array of positive and negative integers, rearrange it so that you have positive integers on one end and negative integers on other [duplicate]给定一个正整数和负整数数组,重新排列它,使一端为正整数,另一端为负整数[重复]
【发布时间】:2017-04-30 21:16:11
【问题描述】:

给定一个正整数和负整数数组,重新排列它,使一端为正整数,另一端为负整数,但保留它们在原始数组中的出现顺序。

例如给定:arr = [2, -12, 4, 46, -20, -1] 答案应该是:arr = [-12, -20, -1, 2, 4, 46]

如何在 JavaScript 中以这种方式排列数组?

谢谢。

【问题讨论】:

  • 什么编程语言?
  • 我在 this similar Q&A 添加了一个 Java 答案的端口。

标签: javascript arrays algorithm


【解决方案1】:

您可以使用reduce() 创建一个包含正负值的对象,然后将这些值合并到一个数组中。

var arr = [2, -12, 4, 46, -20, -1];
var o = arr.reduce(function(r, e) {
  return e < 0 ? r.n.push(e) : r.p.push(e), r
}, {p: [], n: []})

var result = [...o.n, ...o.p]
console.log(result)

【讨论】:

  • 这里似乎很清楚,您重新打开了这个 clear 副本 just 以便能够发布您的答案。请不要再这样做了;这是滥用你的特权。
  • @Matt♦ 知道了。只有一个问题,如果我投票重新打开一些我认为不重复的重复问题,是否会立即重新打开该问题,或者更多用户也需要投票重新打开该问题。
  • 这取决于您是否是某个问题标签中的金牌持有者。如果是,它会立即重新打开。如果没有,您也必须等待其他用户投票。见meta.stackexchange.com/questions/230865/…
【解决方案2】:

您可以使用Array#reduce 函数达到所需的结果。如果迭代元素小于或等于0,则将其添加到结果数组的开头。如果没有 - 将其推到最后。

var arr = [2, -12, 4, 46, -20, -1],
    res = arr.reduce(function(s,a) {
      a <= 0 ? s.unshift(a) : s.push(a);
      return s;
    }, []);
    
    console.log(res);

【讨论】:

  • 你没有意识到仅仅对数组进行排序就已经做了“开始为负,结束为正”的事情吗? XD
  • @NiettheDarkAbsol 该死的,放了个屁xd
  • 一个更有趣的“hack”是arr.sort(function(a,b) {return a/0 - b/0;}) - 它有点滥用NaN 被认为对排序既不是正面也不是负面的事实:D
  • @NiettheDarkAbsol 这是个不错的技巧,但是如果我们已经使用了sort 函数,为什么要让它复杂化而不是简单的a-b? ;d
  • 因为我对问题的理解是排序应该是稳定的,负数按照出现的顺序留下。
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2021-07-26
  • 2014-08-31
  • 2012-03-21
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多