我得到一个作为参数给出的元素列表,这是输入。
If charArray = "ab"
If Join(charArray) = "ab"
If CStr(Join(charArray)) = "ab"
脚本应该将零移动到最后而不更改其他元素顺序。 我的解决方案看起来像这段代码:
JSON.stringify(moveZeros([1,2,0,1,0,1,0,3,0,1]))
这应该将元素的值附加为零值,并将新的0值附加到数组的末尾。它只打印原始数组而不进行修改。
答案 0 :(得分:2)
你有一些括号错误,错过了一些论点。您还使用数组作为参数,无需对参数进行切片。您还错过了splice
这不适用于[9, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]
之类的内容(请参阅下面的更新)
// DOES NOT WORK
var moveZeros = function (arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
arr.splice(i, 1);
arr.push(0);
}
}
console.log(arr);
return arr;
}
var moveZeros = function(args) {
var r = [];
var zeros = 0;
for (var i = 0; i < args.length; i++) {
if (args[i] !== 0) {
r.push(args[i]);
} else zeros++
}
r = r.concat(Array(zeros).fill(0))
console.log(r);
return args;
}
JSON.stringify(moveZeros([9, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]));
答案 1 :(得分:2)
这是因为参数是传入的所有参数。您应该使用arr
而不是参数。
var moveZeros = function (arr) {
var args = arr;
...
}
您将面临的另一个问题是,当您从开始循环到结束并将元素移动到结尾时,您将跳过索引,因为东西向下滑动以填充您刚刚创建的孔。如果使用for循环,则应该使用reduce()
或从结尾循环到开头。
var moveZeros = function(arr) {
var args = arr;
for (var i = args.length - 1; i >= 0; i--) {
if (args[i] === 0) {
args.splice(i, 1);
args.push(0);
}
}
return args;
}
console.log(JSON.stringify(moveZeros([1, 2, 0, 1, 0, 1, 0, 3, 0, 1])));
答案 2 :(得分:2)
您可以使用arr
的副本并使用变量进行长度检查。如果找到零,则长度变量递减,零被推到最后。如果未找到,则索引会递增。
var moveZeros = function (arr) {
var args = arr.slice(),
i = 0,
l = args.length;
while (i < l) {
if (args[i] === 0) {
args.push(args.splice(i, 1)[0]);
l--;
} else {
i++;
}
}
return args;
}
console.log(moveZeros([1, 2, 0, 1, 0, 1, 0, 3, 0, 1]));
或者从最后使用循环。
var moveZeros = function (arr) {
var args = arr.slice(),
i = args.length;
while (i--) {
if (args[i] === 0) {
args.push(args.splice(i, 1)[0]);
}
}
return args;
}
console.log(moveZeros([1, 2, 0, 1, 0, 1, 0, 3, 0, 1]));
答案 3 :(得分:1)
您必须在splice()方法中提供count
个要删除的值。
仅当值为0
时才推送0
。你每次都在推动它。 (提示:因为push语句不在if
)。
使用数组副本:
您可以维护一个新数组并仅将非zzero值推送到它,然后推送所有零。简单易懂。
var moveZeros = function(args) {
var arr = [], zCount = 0;
for (var i = 0; i < args.length; i++) {
args[i] == 0 ? zCount++ : arr.push(args[i]);
}
while (zCount-- > 0) arr.push(0);
console.log(arr);
return arr;
}
JSON.stringify(moveZeros([9, 0, 0, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]));
&#13;
使用反向循环: 你需要一个反向循环,因为每次拼接时你都会跳过一个索引,所以不会删除重复的0。
var moveZeros = function(args) {
for (var i = args.length; i > 0; i--) {
if (args[i] == 0) {
args.splice(i, 1);
args.push(0);
}
}
console.log(args);
return args;
}
JSON.stringify(moveZeros([9, 0, 0, 0, 9, 1, 2, 1, 1, 3, 1, 9, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0]));
&#13;
答案 4 :(得分:1)
我认为这将是最有趣的方式,最好的代码行和使用内置函数(排序)然后它面临更少的性能问题。
var array = [1, 2, 0, -1, 0, 1, 0, 3, 0, 1]
array.sort(a => a === 0);
console.log(array);
&#13;
答案 5 :(得分:0)
首先在迭代它时修改数组是不好的。这可能会导致一些令人困惑的奇怪跳跃。 说你有1,0,0,1 在你的循环中,当你得到索引1时,它将拼接并将零附加到数组的末尾 1,0,1,0 但计数器将增加到2,它将错过现在位置1的0。
看起来你正试图用
创建一个浅表副本var args = Array.prototype.slice.call(arguments);
但我不太确定。 我不会修改你想要返回的数组,而是创建一些临时数组并循环输入,如果它的0为某个计数器,如果它不是0将其推送到保持数组,则推送尽可能多的0。计数器告诉你并返回临时数组