我很难围绕这个问题缠身:/
我的想法是在数组中写一个循环。如果X [i]为负,则启动另一个循环交换X [j]和X [j + 1]直到数组结束。 (为了保留数组的顺序),然后使用pop()。
当我运行脚本时,看起来循环是无限的。此外,如果一行中有两个负值,则第二个可能在i的下一次迭代中被跳过。有更简单的方法吗?
var X = [1,-6,-7,8,9];
//test= [1,-7,8,-6,9]
temp = 0
for (i = 0;i<X.length-1;i++){
if (X[i]<0){
for (j = i;j<=X.length-1;j++){
X[j] = temp
X[j] = X[j+1]
X[j+1] = temp
}
if(X[X.length-1] < 0){X.pop()}
}
};
console.log(X);
答案 0 :(得分:6)
与您提到的方法非常相似,除了没有理由维持秩序(除非描述中缺少)。循环反向,当找到否定时,将其与最后一个元素交换并弹出。如果我们首先弹出所有底片,我们知道最后一个元素不是负面的。
var x = [1, -6, -7, 8, 9, -3];
// strip all negatives off the end
while (x.length && x[x.length - 1] < 0) {
x.pop();
}
for (var i = x.length - 1; i >= 0; i--) {
if (x[i] < 0) {
// replace this element with the last element (guaranteed to be positive)
x[i] = x[x.length - 1];
x.pop();
}
}
document.body.innerHTML = '<pre>' + JSON.stringify(x, null, 4) + '</pre>';
此解决方案具有线性复杂性,因为它只迭代列表一次。
答案 1 :(得分:5)
首先对数组进行排序,使负数位于末尾 我们可以使用将负数移动到最后的回调进行排序。
然后向后迭代并使用pop
删除最后一个索引,只要它们是负数。
我们留下的是积极的价值观。
var X = [-3, 5, 3, 8, 1,-6,-7,8,9];
X.sort(function(a,b) {
return b - a;
});
for (var i=X.length; i--;) {
if ( X[i] < 0 ) X.pop();
}
document.body.innerHTML = '<pre>' + JSON.stringify(X, null, 4) + '</pre>';
&#13;
答案 2 :(得分:3)
已经有很多好的答案。这是一个简单的过滤器,它不对数组进行排序并使用辅助数组索引j <= i
:
function removeNeg(arr) {
var j = 0;
// filter array
for (var i = 0; i < arr.length; i++) {
if (arr[i] >= 0) arr[j++] = arr[i];
}
// pop excess elements
while (j < arr.length) arr.pop();
}
这真的是C程序员对James Montagne的回答,这个问题比较简洁,因为它随你出现而流行。
答案 3 :(得分:1)
var x = [1, -6, -7, 8, 9];
var i = 0;
while (i < x.length) {
if (x[i] < 0) {
x[i] = x[x.length - 1];
x.pop();
} else {
i++;
}
}
只是弹出,没有使用其他方法的数据
答案 4 :(得分:0)
这是一个非常简单的解决方案,不需要排序。对于每个元素,移动它,如果它不是负的则推它。这样做的次数相当于数组大小。这可以通过shift / push或pop / unshift来完成。
var origLen = X.length;
for(var i = 0; i < origLen; i++) {
var val = X.pop();
if(val > 0)
X.unshift(val);
}