【LeetCode】【算法】283. 移动零

LeetCode 283. 移动零

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

思路

简单题,用两个指针解,把所有非0元素置换到数组前面,后面补充0

  1. 定义一个slow指针,专门指向那些0元素,首先用for循环遍历nums数组,找到第一个0位置;
  2. 如果没找到0位置,说明整个数组都不存在0元素,直接返回;
  3. 如果找到了,则fast=slow+1,用for循环使fast遍历完整个nums数组,if (nums[fast]!=0)则将元素赋值给slow,即nums[slow++]=nums[fast],这里之所以是nums[slow++]是因为如果是非0元素,肯定会不断地置换给0位置
  4. 最后从slow出发,将nums后面全部填充为0

代码

java 复制代码
class Solution {
    // 很强的解题思路,直接统计个数,不用做交换,速度上应该会有提升
    public void moveZeroes(int[] nums) {
        int slow = -1;

        // 为slow找到第一个0的位置
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == 0){
                slow = i;
                break;
            }
        }

        if (slow == -1) // 说明不存在非0元素
            return;

        // 非0元素填充
        int fast = slow + 1;
        for ( ; fast < nums.length; fast++){
            if (nums[fast] != 0){
                nums[slow++] = nums[fast];
            }
        }

        // 0元素填充
        if (slow != 0){
            for ( ; slow < nums.length; slow++){
                nums[slow] = 0;
            }
        }
    }
}
相关推荐
云里雾里!41 分钟前
力扣 209. 长度最小的子数组:滑动窗口解法完整解析
数据结构·算法·leetcode
CoderYanger2 小时前
递归、搜索与回溯-穷举vs暴搜vs深搜vs回溯vs剪枝:12.全排列
java·算法·leetcode·机器学习·深度优先·剪枝·1024程序员节
憨憨崽&2 小时前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
chem41113 小时前
C 语言 函数指针和函数指针数组
c语言·数据结构·算法
liu****3 小时前
八.函数递归
c语言·开发语言·数据结构·c++·算法
客梦3 小时前
数据结构-树结构
数据结构·笔记
CM莫问3 小时前
详解机器学习经典模型(原理及应用)——岭回归
人工智能·python·算法·机器学习·回归
DuHz3 小时前
论文阅读——Edge Impulse:面向微型机器学习的MLOps平台
论文阅读·人工智能·物联网·算法·机器学习·edge·边缘计算
梦想的旅途24 小时前
基于雪花算法(Snowflake)的 Go 语言唯一 ID 生成与并发安全实现
算法·安全·golang
Vanranrr4 小时前
C++临时对象与悬空指针:一个导致资源加载失败的隐藏陷阱
服务器·c++·算法