它的想法基本上没有具有相似值的数组中的重复值。
示例数组包含值
input = [1,2,2,2,2,3,4,5,6,7,8,9]<br/>
预期输出有一些东西
likeoutput = [1,2,3,2,4,2,5,2,6,2,7,8,9]<br/>
我已经尝试将它放在for循环中,并检查下一个项目,如果它是相同的,则交换值。问题是当我有连续的相似值时。
答案 0 :(得分:5)
此提案的功能
[1, 1, 1, 1, 3, 3]
),它是如何运作的?
作为示例,我采用这个数组:
[1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9]
使用元素的数量构建一个对象,并将该元素作为键存储。
length = { "1": 1, "2": 4, "3": 1, "4": 1, "5": 1, "6": 1, "7": 1, "8": 1, "9": 1 }
- 选择值最大的属性:
length[2] = 4
使用前一个值的长度创建一个新数组,并用空数组填充它。
output = [[], [], [], [], []]
- 检查是否可以使用扩展阵列。如果没有,请返回。
将
k
设置为属性最大值的键。k = '2'
- 如果真的,继续。否则请转到11。
将
l
设置为length[k]
的值。l = 4
- 遍历
l
并将k
推送到索引为i % outputLength
的数组末尾。增加i
。- 删除属性
k
。- 继续进行5.
- 醇>
返回平面
output
数组。output first then continued array 0: 2 1 6 array 1: 2 3 7 array 2: 2 4 8 array 3: 2 5 9 return: 2 1 6 2 3 7 2 4 8 2 5 9 distance | | | | is equal
function spread(input) {
function findMaxKey() {
var max = 0, key;
Object.keys(length).forEach(function (k) {
if (length[k] > max) {
max = length[k];
key = k;
}
});
return key;
}
var length = input.reduce(function (r, a) {
r[a] = (r[a] || 0) + 1;
return r;
}, {}),
i = 0, k = findMaxKey(), l,
outputLength = length[k],
output = Array.apply(Array, { length: outputLength }).map(function () { return []; });
if (input.length - outputLength < outputLength - 1 ) {
return; // no spread possible
}
while (k = findMaxKey()) {
l = length[k];
while (l--) {
output[i % outputLength].push(k);
i++;
}
delete length[k];
}
return output.reduce(function (r, a) { return r.concat(a) }, []);
}
console.log(spread([1, 2, 2, 2, 2, 3, 4, 5, 6, 7, 8, 9]));
console.log(spread([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]));
console.log(spread([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]));
console.log(spread([1, 1, 1, 1, 3, 3]));
console.log(spread([1, 1, 3]));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
答案 1 :(得分:0)
也许这可以帮到你:
for(var i = 1; i < input.length; i++) {
if(input[i-1] == input[i]) {
var j = i;
while(j < input.length && input[j] == input[i]) {
j++;
}
var el = input[j];
input[j] = input[i];
input[i] = el;
}
}