我目前正在学习JS,并在Codewars上遇到了一些问题。我已经写了一个函数来解决问题,但是我不明白为什么JS中的for循环会表现出它在解决方案中的作用,如果有人可以帮助我,我将非常高兴。 问题如下:
编写一种算法,该算法采用一个数组并将所有零移动到末尾,并保留其他元素的顺序。
moveZeros([1, 2, 0, 1, 0, 1, 0, 3, 0, 1]) // returns[1, 2, 1, 1, 3, 1, 0, 0, 0, 0]
我的解决方法是:
var moveZeros = function(arr) {
let newarr = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {
newarr.push(arr[i])
} else {
newarr.unshift(arr[i])
};
}
return newarr;
}
我的函数返回的是:
[1, 3, 1, 1, 2, 1, 0, 0, 0, 0]
为什么JS在数组中的索引为7却为什么将3放在2之前?
谢谢!
答案 0 :(得分:4)
好吧unshift()
将值推到数组前面。
看看这个例子。了解unshift()
的工作原理。
let a = [];
a.unshift(1);
a.unshift(2);
a.unshift(3);
a.unshift(4);
console.log(a);
Push
在数组的后面添加值。
在下面的示例中了解推式的工作原理。
let a = [];
a.push(1);
a.push(2);
a.push(3);
a.push(4);
console.log(a);
var moveZeros = function (arr) {
let newarr = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {newarr.push(arr[i])}
else {newarr.unshift(arr[i])};
} return newarr;
}
let op = moveZeros([1, 3, 1, 1, 2, 1, 0, 0, 0, 0]);
console.log(op);
答案 1 :(得分:3)
原因是因为unshift总是将数字添加到newarr
例如,从上面的代码中,newarr将如下所示:
i=0: newarr = [1]
i=1: newarr = [2,1]
i=2: newarr = [2,1,0]
i=3: newarr = [1,2,1,0]
i=4: newarr = [1,2,1,0,0]
i=5: newarr = [1,2,1,0,0,0]
i=6: newarr = [1,1,2,1,0,0,0]
i=7: newarr = [3,1,1,2,1,0,0,0]
i=8: newarr = [3,1,1,2,1,0,0,0,0]
i=9: newarr = [1,3,1,1,2,1,0,0,0,0]
答案 2 :(得分:2)
使用示例代码。您可以引入临时数组来存储所有存在的零。然后将其与 newarr
连接var moveZeros = function(arr) {
let newarr = [];
let temp = []; //store all zeros here
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {
temp.push(arr[i])
} else {
newarr.push(arr[i])
};
}
return newarr.concat(temp); //this moves all zeros after the array order
}
此外,如果您想要保留函数参数(即 arr 作为结果变量),则可以将每个零存储在 temporaray数组中,然后从中删除所有零。然后将 arr 与 temp
连接var moveZeros = function(arr) {
let temp = []; //store all zeros here
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 0) {
temp.push(arr[i]);
arr.splice(i,1); /*delete all zeros after storing them this does not affect array order*/
}
}
return arr.concat(temp);
}
答案 3 :(得分:1)
欢迎堆栈溢出。下面的代码将全零放在数组的末尾,其余的保持找到的顺序:
const moveToEnd = (arr) => {
const [head, tail] = arr.reduce(
([head, tail], val) =>
val === 0
? [head, tail.concat(val)]
: [head.concat(val), tail],
[[], []],
);
return head.concat(tail);
};
console.log(moveToEnd([1, 2, 0, 1, 0, 1, 0, 3, 0, 1]));
答案 4 :(得分:-1)
您可以使用sort()函数进行数组排序:
var sortedArray = [1, 2, 0, 1, 0, 1, 0, 3, 0, 1].sort(function(a,b){
return b === 0 && (b - a)
});
b-a表示该顺序的后代。