Javascript算法实践从数组中删除否定

时间:2015-04-21 17:40:37

标签: javascript arrays algorithm

我很难围绕这个问题缠身:/

  • (删除否定)给定多个值的数组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);

5 个答案:

答案 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删除最后一个索引,只要它们是负数。

我们留下的是积极的价值观。

&#13;
&#13;
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;
&#13;
&#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);
}