如何重新排列具有类似项目的数组,以便类似的项目永远不会相互邻居?

时间:2014-08-13 11:17:27

标签: javascript arrays

例如,如果我有这个数组:

var input = [1,1,2,4,6,7,7,1];

我希望输出类似于:

[1,2,1,4,6,7,1,7]

新阵列的顺序无关紧要,只要相似的项目永远不会(或至少尽可能少)彼此相邻。

我可以使用纯JavaScript以及underscore.js。

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

var input = [1,1,2,4,6,7,7,1];
input.sort()
var output = [];
var len = input.length;
for (var i = 0; i < Math.floor((len / 2)); i++) {
    output.push(input[i]);
    output.push(input[len - i - 1]);
}
if (len % 2) {
    var left_over = input[Math.floor(len / 2)];
    if (left_over == output[0]) {
        output.push(left_over);
    } else {
        output.unshift(left_over);
    }
}

或者查看http://jsfiddle.net/d0j3Lfa3/1

解决方案对数字进行排序,然后交替显示高位和低位。它处理奇数个元素,包括[1,1,2]和[1,2,2]等极端情况,它需要以不同的方式推动中间元素传递。由于输入已排序,因此输入顺序不会影响输出。

This answer可能有助于简化一些事情。