leetcode遇到的一个题?

发布于 2022-09-01 19:52:20 字数 667 浏览 8 评论 0

问题:
Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.

For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].

我实现的程序:
var moveZeroes = function(nums) {

nums.forEach(function(val, key, arr){
    if( (key+1) < arr.length) {
        if(val === 0) {
            arr[key] = arr[key+1];
            arr[key+1] = 0;
        }
    }
});

};

运行结果:

Your input

[0,1,0,3,12]
Your answer

[1,0,3,12,0]
Expected answer

[1,3,12,0,0]

为什么没有得到期望的结果?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

反差帅 2022-09-08 19:52:20

如果arr[k+1]本来就是0呢,你这样做是不行的

公布 2022-09-08 19:52:20

forEach() executes the provided callback once for each element present in the array in ascending order.

forEach 是按照数组从左到右的顺序,将每个元素遍历一次,当遍历到第一个元素0时,经过比较判断需要跟后面一个元素换位,此时数组就变成了

[1, 0, 0, 3, 12]

第二个元素此时已经变成了0, 接着遍历到第二个元素,判断为0,继续换位(第2个0和第3个0互换)

[1, 0, 0, 3, 12]

同理

[1, 0, 3, 0, 12]
[1, 0, 3, 12, 0]

所以 你的答案,只是把数组中出现的第一个0移到末尾去

噩梦成真你也成魔 2022-09-08 19:52:20

c#的,通过leetcode,不过性能中等。

public class Solution {
public void MoveZeroes(int[] nums) {
      var stack = new Stack<int>();
        int zeros = 0;

        for (var i = 0; i < nums.Length; i++)
        {
            if (nums[i] == 0)
            {
                zeros++;
                continue;
            }

            stack.Push(nums[i]);
        }

        for (var i = nums.Length - 1; i > nums.Length - 1 - zeros; i--)
        {
            nums[i] = 0;
        }

        for (var i = nums.Length -1 - zeros; i >= 0; i--)
        {
            nums[i] = stack.Pop();
        }
}

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文