在javascript中将零移到数组的末尾-如何不返回任何内容?
我正在尝试用JS完成一个测试。一般来说,我对算法不熟悉,在接受我的第一次提交时遇到了一些困难 问题具体说明如下: 给定一个数组nums,编写一个函数将所有0移到它的末尾,同时保持非零元素的相对顺序 例如,给定nums=[0,1,0,3,12],调用函数后,nums应该是[1,3,12,0,0] 注: 必须在不复制阵列的情况下就地执行此操作。 最小化操作的总数 下面是我的代码:在javascript中将零移到数组的末尾-如何不返回任何内容?,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我正在尝试用JS完成一个测试。一般来说,我对算法不熟悉,在接受我的第一次提交时遇到了一些困难 问题具体说明如下: 给定一个数组nums,编写一个函数将所有0移到它的末尾,同时保持非零元素的相对顺序 例如,给定nums=[0,1,0,3,12],调用函数后,nums应该是[1,3,12,0,0] 注: 必须在不复制阵列的情况下就地执行此操作。 最小化操作的总数 下面是我的代码: /** * @param {number[]} nums * @return {void} Do not retur
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
var i, temp;
for (i = 0; i < nums.length-1; i++) {
if(nums[i] === 0) {
temp = nums.splice(i, 1);
nums.push(temp[0]);
}
}
return null;
};
代码示例顶部的注释是在他们的文本编辑器中提供的,这让我相信我不应该提供任何返回语句。虽然他们网站上的验证器似乎根本不想接受,所以我开始返回null
当我在处理输入后将nums记录到控制台时,我看到了期望的结果nums=[1,3,12,0,0]。不管怎样,我的答案总是被拒绝。我很想了解我在这里做错了什么,这样我就能纠正它
我知道这可能是重复的。我看到了其他关于C和Java的响应,但没有一个是关于JS的。如果必须提供返回语句,但不允许返回任何内容,那么只需编写
return;
如果必须提供return语句,但不允许返回任何内容,则只需编写
return;
javascript中没有任何内容
从技术上讲,null不是什么。试试这个:typeof null。你得到了一个物体,这是非常重要的。如果您运行的函数实际上不返回任何内容:
(function(){})();
您将在控制台中看到undefined。因此,要么返回未定义,要么只返回,要么什么都不返回都可以
排序替代方案
我只是想提出更实际的解决方案,给大家另一个观点。因为它是javascript,所以可以使用排序函数。但是,您必须创建自己的回调来比较元素:
array.sort(function(a, b) { ... comparison here ... });
现在在你的具体情况下,我们想要什么?我们声明
当且仅当a为零且b不为零时,a小于b
因此,我们的回调:
function(a, b) {
if(a==0 && b!=0)
return 1;
else if(b==0 && a!=0)
return -1;
else
return 0;
}
这样使用:
var array = [2,6,0,666,-6,142,0,1,-10];
array.sort(function(a, b) {
if(a==0 && b!=0)
return 1;
else if(b==0 && a!=0)
return -1;
else
return 0;
});
这是我们在实际编写程序时通常做的事情,因为一旦习惯了它,就更容易理解,而且大部分时间更短。javascript中没有任何内容
从技术上讲,null不是什么。试试这个:typeof null。你得到了一个物体,这是非常重要的。如果您运行的函数实际上不返回任何内容:
(function(){})();
您将在控制台中看到undefined。因此,要么返回未定义,要么只返回,要么什么都不返回都可以
排序替代方案
我只是想提出更实际的解决方案,给大家另一个观点。因为它是javascript,所以可以使用排序函数。但是,您必须创建自己的回调来比较元素:
array.sort(function(a, b) { ... comparison here ... });
现在在你的具体情况下,我们想要什么?我们声明
当且仅当a为零且b不为零时,a小于b
因此,我们的回调:
function(a, b) {
if(a==0 && b!=0)
return 1;
else if(b==0 && a!=0)
return -1;
else
return 0;
}
这样使用:
var array = [2,6,0,666,-6,142,0,1,-10];
array.sort(function(a, b) {
if(a==0 && b!=0)
return 1;
else if(b==0 && a!=0)
return -1;
else
return 0;
});
这是我们在实际编写程序时通常会做的,因为一旦习惯了它,就更容易理解,而且大部分时间更短。问题与return语句无关,问题是您的算法错误 [0,0,1,2,3]将返回[0,1,2,3,0] 在正向循环并删除索引时,在下一个索引向下滑动到已覆盖的位置时跳过索引 你需要反向循环。从末尾开始,然后到开头
for (i = nums.length-1; i>=0; i--) {
问题与return语句无关,问题是您的算法错误 [0,0,1,2,3]将返回[0,1,2,3,0] 在正向循环并删除索引时,在下一个索引向下滑动到已覆盖的位置时跳过索引 你需要反向循环。从末尾开始,然后到开头
for (i = nums.length-1; i>=0; i--) {
试试这个:
var moveZeroes = function(nums) {
var i;
for (i = 0; i < nums.length; i++) {
if(nums[i] === 0) {
nums = nums.splice(i, 1);
nums.push(0);
}
}
return;
};
试试这个:
var moveZeroes = function(nums) {
var i;
for (i = 0; i < nums.length; i++) {
if(nums[i] === 0) {
nums = nums.splice(i, 1);
nums.push(0);
}
}
return;
};
正如每个人都已经说过的:当它说不要返回任何东西时,就不要写一个返回语句 但是,您的代码有一个问题。使用测试用例[0,0,1]。
如果从第一个元素开始,它会将其移动到数组的后面,[0,1,0]。现在,循环索引正在查看第二个元素,即1。您完全错过了第二个0。正如大家已经说过的那样:当它说不返回任何内容时,请不要编写返回语句 但是,您的代码有一个问题。使用测试用例[0,0,1]。
如果从第一个元素开始,它会将其移动到数组的后面,[0,1,0]。现在,循环索引正在查看第二个元素,即1。您完全错过了第二个0。按升序排序数组,而不是从末尾到开头循环查找零。 找到后,将a拼接 rray,它将删除当前索引并推零
var moveZeroes = function(nums) {
nums.sort((a,b) => {return a-b});
for(let index = nums.length - 1; index >= 0 ; index--){
if(nums[index] === 0){
nums.splice(index, 1);
nums.push(0);
}
}
};
按升序排序数组,而不是从头到尾循环查找零。 当您找到它时,拼接阵列,它将删除当前索引并推零
var moveZeroes = function(nums) {
nums.sort((a,b) => {return a-b});
for(let index = nums.length - 1; index >= 0 ; index--){
if(nums[index] === 0){
nums.splice(index, 1);
nums.push(0);
}
}
};
//javascript
//单阵列操作:
var a = [1, 2, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 5, 0];
function moveZero(b) {
for (var i = b.length - 1; i >= 0; i--) {
if (b[i] === 0) {
b.splice(i, 1);
b.push(0);
}
}
return b;
}
console.log(moveZero(a));
//多数组操作=>另一种方法
//算法:推送数组中的所有非零元素和另一个数组中的所有零
//一旦循环终止,就对其进行concat
var a = [1, 2, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 5, 0];
var b = [];
var c = [];
function moveZero(data) {
for (var i = 0; i < data.length - 1; i++) {
if (data[i] !== 0) {
b.push(data[i]);
} else {
c.push(0)
}
}
if (c.length > 0) {
b = b.concat(c);
}
return b;
}
console.log(moveZero(a));
//javascript
//单阵列操作:
var a = [1, 2, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 5, 0];
function moveZero(b) {
for (var i = b.length - 1; i >= 0; i--) {
if (b[i] === 0) {
b.splice(i, 1);
b.push(0);
}
}
return b;
}
console.log(moveZero(a));
//多数组操作=>另一种方法
//算法:推送数组中的所有非零元素和另一个数组中的所有零
//一旦循环终止,就对其进行concat
var a = [1, 2, 0, 0, 3, 0, 3, 0, 2, 0, 0, 0, 5, 0];
var b = [];
var c = [];
function moveZero(data) {
for (var i = 0; i < data.length - 1; i++) {
if (data[i] !== 0) {
b.push(data[i]);
} else {
c.push(0)
}
}
if (c.length > 0) {
b = b.concat(c);
}
return b;
}
console.log(moveZero(a));
使用JAVA将零移动到数组末尾
import java.util.Arrays;
public class MoveZerosToEndWithJava {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] A = { 6, 8, 0, 2, 3, 0, 4, 1 };
moving(A);
}
public static void moving(int[] a) {
int countZero = 0;
System.out.println(Arrays.toString(a));
System.out.print("[");
for (int i = 0; i < a.length; i++) {
if (a[i] == 0) {
countZero++;
} else {
if (i + 1 == a.length && countZero == 0) {
System.out.print(a[i] + "]");
} else {
System.out.print(a[i] + ", ");
}
}
}
for (int i = 0; i < countZero; i++) {
if (i + 1 == countZero) {
System.out.print("0");
} else
System.out.print("0, ");
}
if (countZero > 0) {
System.out.println("]");
}
}
}
使用JAVA将零移动到数组末尾
import java.util.Arrays;
public class MoveZerosToEndWithJava {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] A = { 6, 8, 0, 2, 3, 0, 4, 1 };
moving(A);
}
public static void moving(int[] a) {
int countZero = 0;
System.out.println(Arrays.toString(a));
System.out.print("[");
for (int i = 0; i < a.length; i++) {
if (a[i] == 0) {
countZero++;
} else {
if (i + 1 == a.length && countZero == 0) {
System.out.print(a[i] + "]");
} else {
System.out.print(a[i] + ", ");
}
}
}
for (int i = 0; i < countZero; i++) {
if (i + 1 == countZero) {
System.out.print("0");
} else
System.out.print("0, ");
}
if (countZero > 0) {
System.out.println("]");
}
}
}
这是一个解决问题的方法:
var moveZeroes = function(nums) {
let count = 0;
for (let i = 0; i < nums.length; i++){
if(nums[i] !== 0){
nums[count++] = nums[i];
}
}
for (let i = count; i < nums.length; i++){
nums[i] = 0;
}
return nums;
};
这是一个解决问题的方法:
var moveZeroes = function(nums) {
let count = 0;
for (let i = 0; i < nums.length; i++){
if(nums[i] !== 0){
nums[count++] = nums[i];
}
}
for (let i = count; i < nums.length; i++){
nums[i] = 0;
}
return nums;
};
也可以这样做:
var moveZeroes = function(nums) {
var len = nums.length, i = nums.indexOf(0);
while(~i && i < --len){
nums.splice(i, 1);
nums.push(0);
i = nums.indexOf(0);
}
};
也可以这样做:
var moveZeroes = function(nums) {
var len = nums.length, i = nums.indexOf(0);
while(~i && i < --len){
nums.splice(i, 1);
nums.push(0);
i = nums.indexOf(0);
}
};
试试这个
试试这个
使用ES6功能尝试这种方法
let filteredArr = nums.filter((elem) => {
return elem !== 0;
}) // Create a new Array with all non zero elements
let countOfZero = nums.length - filteredArr.length // Get Count of Zero elements
let newArr = [...filteredArr,...Array(countOfZero).fill(0)] // Create a new array containig only zero equivalent to count of zero elements and filtered non zero elements Array
return nums.splice(0,nums.length,...newArr) // Use splice to alter original array and then add new Array using spread operator
使用ES6功能尝试这种方法
let filteredArr = nums.filter((elem) => {
return elem !== 0;
}) // Create a new Array with all non zero elements
let countOfZero = nums.length - filteredArr.length // Get Count of Zero elements
let newArr = [...filteredArr,...Array(countOfZero).fill(0)] // Create a new array containig only zero equivalent to count of zero elements and filtered non zero elements Array
return nums.splice(0,nums.length,...newArr) // Use splice to alter original array and then add new Array using spread operator
这是一个简单的例子
函数校验{
var i=0;
var j=arr.length-1;
whilej>i+1{
ifarr[i]!==0{
i++;
}
ifarr[j]==0{
j-;
}
ifarr[i]==0{
arr[i]=arr[j];
arr[j]=0;
}
}
返回arr;
} 这是一个简单的例子
函数校验{
var i=0;
var j=arr.length-1;
whilej>i+1{
ifarr[i]!==0{
i++;
}
ifarr[j]==0{
j-;
}
ifarr[i]==0{
arr[i]=arr[j];
arr[j]=0;
}
}
返回arr;
} 在这种情况下,接头用于移除零元件。然后,将零推到数组的末尾
var moveZeroes = function (nums) {
var length = nums.length;
while (length-- > -1) {
if (nums[length] == 0) nums.splice(length, 1).push(0);
}
return nums;
};
在这种情况下,接头用于移除零元件。然后,将零推到数组的末尾
var moveZeroes = function (nums) {
var length = nums.length;
while (length-- > -1) {
if (nums[length] == 0) nums.splice(length, 1).push(0);
}
return nums;
};
完全删除返回null。1“returning void”表示:不返回任何内容。所以只要写“return;”或者不要写任何返回语句。2通过使用排序和正确的排序功能,你可以用很少的代码写出答案。你的循环应该从结尾到开头。你的问题的标题有误导性。我建议将其更改为如何让return语句不返回任何内容?如果你不提这个练习是关于排序的,那就更好了,这样读者就可以专注于你问题的本质。我想知道你是否可以完全删除temp,而改为按0。所以if里面的线应该是nums.i,1;nums.push0.完全删除返回null。1“returning void”表示:不返回任何内容。所以只要写“return;”或者不要写任何返回语句。2通过使用排序和正确的排序功能,你可以用很少的代码写出答案。你的循环应该从结尾到开头。你的问题的标题有误导性。我建议将其更改为如何让return语句不返回任何内容?如果你不提这个练习是关于排序的,那就更好了,这样读者就可以专注于你问题的本质。我想知道你是否可以完全删除temp,而改为按0。所以if里面的线应该是nums.i,1;nums.push0.array项是数字。排序函数可以写成函数{返回a*b?1:b?-1:0;}是的,这是一个很好的快捷方式,做得好。但即使我想到了这一点,我也不会用它来回答,因为乍一看有点不清楚。数组项就是数字。排序函数可以写成函数{返回a*b?1:b?-1:0;}是的,这是一个很好的快捷方式,做得好。但即使我想到了这一点,我也不会用它来回答,因为它乍一看有点不清楚。输入得很好。谢谢你的反馈。很好的输入。感谢您的反馈。感谢您的解释。感谢您的解释。编辑您的答案缩进并向其添加简短的解释。编辑您的答案缩进并向其添加简短的解释。这是一个JavaScript问题,而不是Java。第一行表示使用Java将零移动到数组的末尾。顺便说一下谢谢好吗?事实上,你所说的这一点并没有减少与JavaScript相关的问题。这是为所有想使用Java的人准备的。这是一个关于如何使用JavaScript的问题。看到这个问题的人会想知道如何用JavaScript实现它。如果他们想知道如何在Java中实现这一点,他们将寻找一个关于Java的问题。这是一个JavaScript问题,而不是Java。第一行说用Java将零移到数组的末尾。顺便说一下谢谢好吗?事实上,你所说的这一点并没有减少与JavaScript相关的问题。这是为所有想使用Java的人准备的。这是一个关于如何使用JavaScript的问题。看到这个问题的人会想知道如何用JavaScript实现它。如果他们想知道如何在Java中实现,他们将寻找一个任务
这将从数组中删除零。这将从数组中删除零。