【经典算法】LeetCode 283. 移动零(Java/C/Python3/Go实现含注释说明,Easy)

简介: 【经典算法】LeetCode 283. 移动零(Java/C/Python3/Go实现含注释说明,Easy)
  • 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法(公众号同名
  • ❤️觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论,💬支持博主,记得点个大大的关注,持续更新🤞
    ————————————————-

移动零

  • 标签(题目类型):数组,双指针

题目描述

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

示例:

输入: [0,1,0,3,12]

输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。

尽量减少操作次数。

原题:283. 移动零

思路及实现

方式一:双指针

思路

使用两个指针 iji 用于遍历数组,j 用于指向非零元素应该存放的位置。遍历数组时,如果当前元素不为零,则将其交换到 j 的位置,并将 j 后移一位。这样,遍历结束后,所有非零元素都移动到了数组的前面,而后面的位置都是零。

代码实现

Java版本
public void moveZeroes(int[] nums) {
    int j = 0; // 指向非零元素应该存放的位置
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] != 0) {
            // 如果当前元素不为零,则交换到 j 的位置,并将 j 后移一位
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            j++;
        }
    }
}

说明:

  • 变量 j 初始化为0,表示非零元素应该存放的起始位置。
  • 遍历数组 nums,如果当前元素不为零,则与 nums[j] 交换位置,并将 j 后移一位。
  • 遍历结束后,所有非零元素都移动到了数组的前面,后面的位置都是零。
C语言版本
void moveZeroes(int* nums, int numsSize) {
    int j = 0; // 指向非零元素应该存放的位置
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] != 0) {
            // 如果当前元素不为零,则交换到 j 的位置,并将 j 后移一位
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            j++;
        }
    }
}

说明:

  • 与Java版本类似,使用 j 指针来记录非零元素应该存放的位置。
  • 交换非零元素到 j 的位置,并更新 j 的值。
Python3版本
def moveZeroes(nums):
    j = 0  # 指向非零元素应该存放的位置
    for i in range(len(nums)):
        if nums[i] != 0:
            # 如果当前元素不为零,则交换到 j 的位置,并将 j 后移一位
            nums[i], nums[j] = nums[j], nums[i]
            j += 1

说明:

  • 使用Python的简洁语法,直接交换元素的位置。
  • 变量 j 的作用和逻辑与Java和C版本相同。
Golang版本
func moveZeroes(nums []int) {
    j := 0 // 指向非零元素应该存放的位置
    for i := 0; i < len(nums); i++ {
        if nums[i] != 0 {
            // 如果当前元素不为零,则交换到 j 的位置,并将 j 后移一位
            nums[i], nums[j] = nums[j], nums[i]
            j++
        }
    }
}

说明:

  • Golang的实现逻辑与Java和C类似,通过 j 指针来记录非零元素应该存放的位置。
  • 交换元素时,使用Golang的多返回值赋值特性。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。只需要遍历数组一次。
  • 空间复杂度:O(1)。只使用了常数级别的额外空间。

方式二:计数法

思路

首先遍历数组,统计非零元素的个数。然后再次遍历数组,将非零元素按顺序放到数组的前面,其余位置填充为零。

代码实现

Java版本
public void moveZeroes(int[] nums) {
    int count = 0; // 统计非零元素的个数
    for (int num : nums) {
        if (num != 0) {
            count++;
        }
    }
    
    int index = 0; // 非零元素应该存放的位置索引
    for (int num : nums) {
        if (num != 0) {
            nums[index] = num; // 将非零元素按顺序放到数组的前面
            index++;
        }
    }
    
    // 将剩余位置填充为零
    while (index < nums.length) {
        nums[index] = 0;
        index++;
    }
}

说明:

  • 第一次遍历数组,统计非零元素的个数。
  • 第二次遍历数组,将非零元素按顺序放到数组的前面。
  • 最后,将剩余的位置填充为零。
C语言版本
void moveZeroes(int* nums, int numsSize) {
    int count = 0; // 统计非零元素的个数
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] != 0) {
            count++;
        }
    }
    
    int index = 0; // 非零元素应该存放的位置索引
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] != 0) {
            nums[index] = nums[i]; // 将非零元素按顺序放到数组的前面
            index++;
        }
    }
    
    // 将剩余位置填充为零
    while (index < numsSize) {
        nums[index] = 0;
        index++;
    }
}

说明:

  • 与Java版本类似,使用两次遍历,第一次统计非零元素个数,第二次将非零元素按顺序放到数组前面,并将剩余位置填充为零。
Python3版本
def moveZeroes(nums):
    count = sum(1 for num in nums if num != 0) # 统计非零元素的个数
    index = 0 # 非零元素应该存放的位置索引
    for num in nums:
        if num != 0:
            nums[index] = num # 将非零元素按顺序放到数组的前面
            index += 1
    
    # 将剩余位置填充为零
    while index < len(nums):
        nums[index] = 0
        index += 1

说明:

  • 使用Python的简洁语法和特性来实现计数和填充操作。
Golang版本
func moveZeroes(nums []int) {
    count := 0 // 统计非零元素的个数
    for _, num := range nums {
        if num != 0 {
            count++
        }
    }
    
    index := 0 // 非零元素应该存放的位置索引
    for _, num := range nums {
        if num != 0 {
            nums[index] = num // 将非零元素按顺序放到数组的前面
            index++
        }
    }
    
    // 将剩余位置填充为零
    for i := index; i < len(nums); i++ {
        nums[i] = 0
    }
}

说明:

  • Golang版本的实现逻辑与其他语言版本类似,通过两次遍历来实现移动零元素。

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。需要遍历数组两次。
  • 空间复杂度:O(1)。只使用了常数级别的额外空间。

总结

方式 优点 缺点 时间复杂度 空间复杂度
方式一(双指针) 代码简洁,易于理解 无明显缺点 O(n) O(1)
方式二(计数法) 逻辑清晰,易于实现 需要遍历数组两次 O(n) O(1)

相似题目

相似题目 难度 链接
leetcode 27 简单 力扣27
leetcode 28 简单 力扣28

欢迎一键三连(关注+点赞+收藏),技术的路上一起加油!!!代码改变世界

  • 关于我:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法公众号同名),回复暗号,更能获取学习秘籍和书籍等
相关文章
|
4天前
|
存储 监控 算法
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
|
1天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
25 6
|
1天前
|
算法 Java API
Java 方法注释:规范、实用和高质量的写法
本文深入探讨了如何编写高质量的 Java 方法注释
22 11
|
1天前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
25 5
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
4天前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
|
14天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
27天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
166 80
|
15天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
15天前
|
算法
基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
本设计基于龙格库塔算法对锅炉单相受热管进行建模与MATLAB数值仿真,简化为喷水减温器和末级过热器组合,考虑均匀传热及静态烟气处理。使用MATLAB2022A版本运行,展示自编与内置四阶龙格库塔法的精度对比及误差分析。模型涉及热传递和流体动力学原理,适用于优化锅炉效率。

热门文章

最新文章