rob*_*bby 1 javascript arrays algorithm
我正在尝试用 JS完成leetcode.com 的问题。我一般不熟悉算法,并且在我的第一次提交被接受时遇到了一些麻烦。
该问题规定了以下内容:
给定一个数组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;
};
Run Code Online (Sandbox Code Playgroud)
代码示例顶部的注释是在他们的文本编辑器中提供的,这让我相信我不应该提供任何 return 语句。尽管他们网站上的验证器似乎根本不想接受这一点,但我开始返回 null ...
当我nums在处理输入后登录到控制台时,我看到了所需的结果nums = [1, 3, 12, 0, 0]。不管怎样,我的回答总是被拒绝。我很想知道我在这里做错了什么,所以我可以解决它。
我知道这可能是重复的。我看到其他关于 C 和 Java 的响应,但我没有看到处理 JS。
epa*_*llo 11
问题与返回语句无关,问题是您的算法错误。
[0,0,1,2,3] 将返回 [0,1,2,3,0]
当您沿正方向循环并删除索引时,您会在下一个索引向下滑动到您已经覆盖的位置时跳过索引。
你需要在负方向循环。从最后开始,然后走到起点。
for (i = nums.length-1; i>=0; i--) {
Run Code Online (Sandbox Code Playgroud)
小智 9
这是该问题的 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;
};
Run Code Online (Sandbox Code Playgroud)