我正在尝试在JS中完成leetcode.com question。我是一般的算法新手,在接受我的第一次提交时遇到了一些麻烦。
该问题指定以下内容:
给定一个数组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;
};
代码示例顶部的注释在其文本编辑器中提供,并让我相信我不应该提供任何return语句。虽然他们网站上的验证器似乎根本不想接受,所以我开始返回null ...
当我在处理输入后将nums
记录到控制台时,我看到了所需的结果nums = [1, 3, 12, 0, 0]
。无论我的答案一直被拒绝。我很想知道我在这里做错了什么,所以我可以解决它。
我知道这可能是重复的。我看到了处理C和Java的其他响应,但我没有看到处理过JS。
答案 0 :(得分:3)
问题与return语句无关,问题是你的算法错了。
[0,0,1,2,3]
将返回[0,1,2,3,0]
当你向正方向循环并删除索引时,你跳过索引,因为下一个索引向下滑动到你已经覆盖的位置。
你需要向负方向循环。从最后开始,然后开始。
for (i = nums.length-1; i>=0; i--) {
答案 1 :(得分:2)
正如大家已经说过的那样:当它说不返回任何东西时,根本就不要写回报声明。
但是,您的代码存在问题。使用测试用例[0,0,1]。 如果从第一个元素开始,则将其移动到数组的后面,[0,1,0]。现在你的循环索引正在查看第二个元素,即1.你完全错过了第二个元素。
答案 2 :(得分:0)
null
并非一无是处。试试这个:typeof null
。你得到"object"
,这几乎就是其中之一。如果你运行的函数确实没有返回任何内容:
(function(){})();
您将在控制台中看到undefined
。因此,return undefined
或return
或任何内容都不会被视为正常。
我只是想提出更实际的解决方案,给你另一种观点。既然是javascript,你可以使用sort函数。您必须创建自己的回调来比较元素:
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;
});
这是我们在实际编写程序时通常所做的事情,因为它更容易理解(一旦你习惯了),并且在大多数时候都更短。
答案 3 :(得分: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);
}
}
};
答案 4 :(得分:0)
function pushZerosToEnd(arr){
.animateNextImage div{
width: 33.3333%;
float:left;
height: 100%;
background-repeat: no-repeat;
background-size: cover;
background-position: -100% 0%;
transition: background-position 0.5s ease;
}
.animateNextImage.active div:nth-child(1){
transition-delay: 0.4s;
background-position: 0% 0%;
}
.animateNextImage.active div:nth-child(2){
transition-delay: 0.2s;
background-position: 50% 0%;
}
.animateNextImage.active div:nth-child(3){
background-position: 100% 0%;
}
console.log(pushZerosToEnd([0,1,2,0,3,0,5,6]));
答案 5 :(得分: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));
//多数组操作=>另一种方法 //算法:将一个数组中的所有非零元素推入另一个数组中的所有零 //一旦循环终止就连接它们
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));
答案 6 :(得分:0)
这是该问题的O(n)解决方案:
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;
};
答案 7 :(得分: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);
}
};
答案 8 :(得分:0)
尝试这个
function order(array){
count = 0;
for(var i=0;i<array.length;i++){
if(array[i] !== 0){
//non zero element count
array[count] = array[i]
count++;
}
}
while(count<array.length){
array[count] = 0
count++
}
return array
}
var array = [1, 9, 8, 4, 0, 0, 2, 7, 0, 6, 0]
console.log(order(array))
答案 9 :(得分: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
答案 10 :(得分:0)
这是简单的
function check(arr){
var i=0;
var j=arr.length-1;
while(j>i+1){
if(arr[i]!==0){
i++;
}
if(arr[j]===0){
j--;
}
if(arr[i]===0){
arr[i]=arr[j];
arr[j]=0;
}
}
return arr;
}
答案 11 :(得分:0)
Splice()用于删除元素(在这种情况下为零)。然后,将零推到数组的末尾。
var moveZeroes = function (nums) {
var length = nums.length;
while (length-- > -1) {
if (nums[length] == 0) nums.splice(length, 1).push(0);
}
return nums;
};
答案 12 :(得分:0)
这是一个非常简单的解决方案:
时间复杂度 O(n)
var moveZeroes = function(nums) {
var i = nums.length;
while (i > -1) {
let current = nums[i];
if(nums[i] === 0) {
nums.splice(i,1)
nums.push(current)
}
i--;
}
return nums;
};
let arr = [0,1,0,3,12]
console.log(moveZeroes(arr))
答案 13 :(得分:-1)
如果您必须提供退货声明,但不允许退货,您可以写
return;
答案 14 :(得分:-1)
使用JAVA将零移动到数组结尾
import java.util.Arrays;
公共类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("]");
}
}
}
答案 15 :(得分:-2)
试试这个:
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;
};