Javascript算法练习从数组中删除负片

Javascript算法练习从数组中删除负片,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我很难将我的大脑围绕在这个问题上:/ (删除负数)给定一个包含多个值的数组X(例如,[-3,5,1,3,2,10]),编写一个程序删除数组中的任何负数。一旦你的程序完成,X应该由正数组成在不创建临时数组的情况下执行此操作,并且仅使用pop方法删除数组中的任何值。 我的想法是在数组中写一个循环。如果X[i]为负,则开始另一个循环,交换X[j]和X[j+1],直到阵列结束。(保留数组的顺序)然后使用pop() 当我运行脚本时,循环看起来是无限的。此外,如果一行中有两个负值,则第二个负值可能会在i

我很难将我的大脑围绕在这个问题上:/

  • (删除负数)给定一个包含多个值的数组X(例如,[-3,5,1,3,2,10]),编写一个程序删除数组中的任何负数。一旦你的程序完成,X应该由正数组成在不创建临时数组的情况下执行此操作,并且仅使用pop方法删除数组中的任何值。
我的想法是在数组中写一个循环。如果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);
var X=[1,-6,-7,8,9];
//测试=[1,-7,8,-6,9]
温度=0

对于(i=0;i首先对数组排序,使负数位于末尾。
我们可以使用回调进行排序,将负数移到末尾

然后向后迭代并使用
pop
删除最后的索引,只要它们是负数

我们剩下的是正值

var X=[-3,5,3,8,1,6,7,8,9];
X.排序(函数(a、b){
返回b-a;
});
对于(var i=X.length;i--;){
如果(X[i]<0)X.pop();
}

document.body.innerHTML=''+JSON.stringify(X,null,4)+'';
与您提到的方法非常相似,只是没有理由维持顺序(除非描述中缺少此项).Loop反向,当找到负片时,将其与最后一个元素交换并弹出。如果我们首先弹出结尾处的所有负片,我们知道最后一个元素不是负片

var origLen = X.length;

for(var i = 0; i < origLen; i++) {
  var val = X.pop();

  if(val > 0)
     X.unshift(val);
}
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();
}
var x=[1,-6,-7,8,9,-3];
//把末端的底片都去掉
while(x.length&&x[x.length-1]<0){
x、 pop();
}
对于(变量i=x.length-1;i>=0;i--){
if(x[i]<0){
//用最后一个元件替换此元件(保证为正极)
x[i]=x[x.长度-1];
x、 pop();
}
}

document.body.innerHTML=''+JSON.stringify(x,null,4)+'';
这是一个非常简单的解决方案,它不需要排序。对于每个元素,移动它,如果它不是负数,则推送它。这样做的次数与数组大小相等。这可以通过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);
}
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();
}
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++;
    }
}   
var origLen=X.length;
对于(变量i=0;i0)
X.取消移位(val);
}

已经有很多很好的答案。这里有一个简单的过滤器,它不排序数组,而是使用辅助数组索引
j=0)arr[j++]=arr[i];
}
//流行元素
而(j
这实际上是C程序员对James Montagne的答案的一种处理方法,它更简洁,因为它会随着你的前进而弹出。

var x=[1,-6,-7,8,9];
var i=0;
而(i

只是弹出,没有使用其他数组方法

您提到保留数组的顺序,但为什么?描述中没有提到任何关于保持顺序的内容。是否允许您使用
Array.splice
?您是无限循环,因为您的
j
循环中有
X[j+1]=temp
。当
j
等于
X.length-1
时,此行将向数组中添加一个额外的条目,使其再次循环,再次添加循环并添加。。。永远也可以是带有
filter()
的(几乎)一行程序,即
x.filter(函数(el){if(el<0){return false;}return true;})
不会返回一个新数组,我认为关键是在不创建临时数组的情况下改变数组的位置?@jdpenix
filter
会创建一个新数组。@JamesMontagne-也许,这是我能想到的最好的方法,当使用
pop
时,要弹出的值必须在最后,不能在中间弹出?确实,打得好。我想知道为什么不需要创建临时数组。对于JavaScript程序来说,这似乎是一个向后的要求,当它具有内置功能(即,
filter()
)时,几乎可以完成它们所需要的功能,但现在您使用的是
shift
从数组中删除,而不是
pop
,这是一个非常简洁的解决方案。