Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中将零移到数组的末尾-如何不返回任何内容?_Javascript_Arrays_Algorithm - Fatal编程技术网

在javascript中将零移到数组的末尾-如何不返回任何内容?

在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

我正在尝试用JS完成一个测试。一般来说,我对算法不熟悉,在接受我的第一次提交时遇到了一些困难

问题具体说明如下:

给定一个数组nums,编写一个函数将所有0移到它的末尾,同时保持非零元素的相对顺序

例如,给定nums=[0,1,0,3,12],调用函数后,nums应该是[1,3,12,0,0]

注: 必须在不复制阵列的情况下就地执行此操作。 最小化操作的总数

下面是我的代码:

/**
 * @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中实现,他们将寻找一个任务
这将从数组中删除零。这将从数组中删除零。