[Java·算法·简单] LeetCode 283. 移动零

简介: [Java·算法·简单] LeetCode 283. 移动零

题目

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

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

示例

示例1

输入:nums = [100,4,200,1,3,2]

输出:4

解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4

示例2

输入: nums = [0]

输出: [0]

提示

👉️ 力扣原文

class Solution {
    public void moveZeroes(int[] nums) {
        if(nums == null){
            return;
        }
 
        int j=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i] != 0){
                nums[j++] = nums[i];
            }
        }
 
        for(int i=j;i<nums.length;++i){
            nums[i]=0;
        }
    }
}

详细解读

这段代码实现了将数组中的所有零元素移动到数组末尾的操作,同时保持非零元素的相对顺序不变。下面是对代码的解释:

  1. 首先,检查输入的数组是否为空,如果为空,则直接返回,因为无需进行任何操作。
  2. 创建一个指针j初始化为0,用于记录非零元素应该放置的位置。
  3. 进行一次遍历数组。对于每个非零元素,将其放置到nums[j]位置,并递增j
  4. 完成第一次遍历后,数组中所有的非零元素都已经按顺序移动到了数组的前部,而j的值也指向了下一个可能为零的位置。
  5. 进行第二次遍历,从j开始,将剩余的数组位置都置为零,以完成所有零元素的移动操作。

这段代码的时间复杂度为O(n),其中n是数组的长度,因为它只需要对数组进行两次遍历。

idea上代码运行

public class Main {
    public static void main(String[] args) {
        Solution solution = new Solution();
 
        // 示例用例1
        int[] nums1 = {0, 1, 0, 3, 12};
        solution.moveZeroes(nums1);
        System.out.println("移动零后的数组1:");
        for (int num : nums1) {
            System.out.print(num + " ");
        }
        System.out.println();
 
        // 示例用例2
        int[] nums2 = {0, 0, 0, 1, 2, 3};
        solution.moveZeroes(nums2);
        System.out.println("移动零后的数组2:");
        for (int num : nums2) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

相关文章
|
6天前
|
缓存 算法 安全
Java中的数据结构与算法优化策略
Java中的数据结构与算法优化策略
|
4天前
|
算法 Java
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
Java面试题:解释垃圾回收中的标记-清除、复制、标记-压缩算法的工作原理
13 1
|
6天前
|
缓存 算法 NoSQL
Java中的分布式缓存与一致性哈希算法
Java中的分布式缓存与一致性哈希算法
|
2天前
|
存储 算法 Java
分布式自增ID算法---雪花算法(SnowFlake)Java实现
分布式自增ID算法---雪花算法(SnowFlake)Java实现
|
4天前
|
算法 Java 程序员
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
Java面试题:解释Java的垃圾回收机制,包括常见的垃圾回收算法。介绍一下Java的垃圾回收算法中的标记-压缩算法。
8 0
|
5天前
|
算法 Java 开发者
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
8 0
|
5天前
|
存储 算法 Java
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
Java面试题:解释JVM的内存结构,并描述堆、栈、方法区在内存结构中的角色和作用,Java中的多线程是如何实现的,Java垃圾回收机制的基本原理,并讨论常见的垃圾回收算法
7 0
|
7天前
|
监控 算法 搜索推荐
有效利用Java中的内置算法优化应用性能
有效利用Java中的内置算法优化应用性能
|
7天前
|
存储 算法 搜索推荐
使用Java实现高效的数据结构与算法
使用Java实现高效的数据结构与算法
|
1月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题