• 力扣刷题之移动零


    力扣刷题之移动零


    这是力扣题中的第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

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

  • 相关阅读:
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    插件化编程之WebAPI统一返回模型
    阿里云邮件推送配置教程:有哪些关键步骤?
    swoole是怎么提高php系统的性能的
    基础DQL(数据查询)—— 子查询(含实例)
    【C++】哈希基础1
    C语言学习-数组应用-三子棋(4.1)
    Qt中布局管理使用总结
    Git常用命令
    虚幻5.1 常见的效果关闭方式
  • 原文地址:https://blog.csdn.net/jgdabc/article/details/126094981