力扣刷题之移动零

举报
兰舟千帆 发表于 2022/08/02 22:06:38 2022/08/02
【摘要】 力扣刷题之移动零 这是力扣题中的第283题。 题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况...

力扣刷题之移动零


这是力扣题中的第283题。

题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

在这里插入图片描述
题目要求将数组中的零移动到数组后面。并且只能在原数组上操作,不可以复制,不可以打乱原来数组元素的顺序。

于是对于中元素的移动的话,如果脑子转动不是很灵光的话,就建议去自己画一个图去试着操作,看看怎么去移动。

你看这些打乱的零怎么移动到后面

在这里插入图片描述

将零移动到后面,那就需要将非零元素移动到前面。

一种想法,我们可以用两个指针,然后开始同时初始化指向数组的头部。
在这里插入图片描述
然后怎么移动呢?黄色的指针开始移动,移动到3,它不是零,我们将它替换掉白色位置上的0的值。
在这里插入图片描述
继续,到这里的时候,我们的黄色指针指向零,我们当然是不会将零前移动的。
在这里插入图片描述
这里没有发生移动,白色的指针不要动,黄色的继续移动。
移动到4的时候,然后黄色指向处的数替换白色执行处的值。
在这里插入图片描述
然后两个指针继续移动,此时黄色处的值再次替换白色指针处的值,黄色指针到达终点
在这里插入图片描述
然后我们白色指针继续移动到终点,并对后面的索引处的值赋0。
在这里插入图片描述
这样就移动好了。

我们按照这种逻辑来编写代码

class Solution {
    public void moveZeroes(int[] nums) {
        
        int pre01 =0;
        for (int pre02 = 0; pre02 < nums.length; pre02++) {
           if (nums[pre02]!=0)
           {
               nums[pre01++]=nums[pre02];
           }

        }


        for (int i = pre01; i < nums.length; i++) {
            nums[i]=0;

        }

    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述
还有一种方法,在思路上有所区别。这次我们还是初始化两个指针。
只不过这次交换的时候,我们是这样做的。

在这里插入图片描述
我们在比较的时候就直接交换。
在这里插入图片描述
然后移动,这里两个都是零,不交换。黄色的移动,白色的不变
在这里插入图片描述
下一步交换
在这里插入图片描述
继续
在这里插入图片描述
仔细比较的话,这两种方法存在这区别。我们交换的模式不一样,指针移动到的位置不一样。
来看代码实现。

  int pre01 =0;
        for (int pre02 = 0; pre02 < nums.length; pre02++) {
            if(nums[pre01]==0&&nums[pre02]!=0)
            {
               int n= nums[pre02];
               nums[pre02]=nums[pre01];
               nums[pre01++] =n;


            }
            else if (nums[pre01]!=0)
            {
                pre01++;
            }

        }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这样的执行效率不如我们上面的方法高,但是上一种似乎更是像钻空子。
在这里插入图片描述

文章来源: daodaozi.blog.csdn.net,作者:兰舟千帆,版权归原作者所有,如需转载,请联系作者。

原文链接:daodaozi.blog.csdn.net/article/details/126094981

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。