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方法删除数组中的任何值。
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;})
不会返回一个新数组,我认为关键是在不创建临时数组的情况下改变数组的位置?@jdpenixfilter
会创建一个新数组。@JamesMontagne-也许,这是我能想到的最好的方法,当使用pop
时,要弹出的值必须在最后,不能在中间弹出?确实,打得好。我想知道为什么不需要创建临时数组。对于JavaScript程序来说,这似乎是一个向后的要求,当它具有内置功能(即,filter()
)时,几乎可以完成它们所需要的功能,但现在您使用的是shift
从数组中删除,而不是pop
,这是一个非常简洁的解决方案。