283. 移动零

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 283. 移动零

本题来自 LeetCode:283. 移动零[1]

题目描述

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


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

说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

题目分析

采用双指针,一个慢指针(记录当前无 0值的数组长度),一个快指针(用来遍历整个数组)。用快指针位置的值和 0比较,若相等,则移动该元素到慢指针的位置上,同时也需要将快指针的位置补 0;否则继续比较快指针的下一个值。

题目解答

解法一


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

复杂度分析:
时间复杂度: O(n)
空间复杂度: O(1)

解法二

也可以第一次遍历只移动不为 0的元素,第二次遍历将后面的位置补 0


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

复杂度分析:
时间复杂度: O(n)
空间复杂度: O(1)

参考资料

  1. 移动零: https://leetcode-cn.com/problems/move-zeroes/

原文始发于微信公众号(xiaogan的技术博客):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 283. 移动零


  转载请注明: 好好学java 283. 移动零

 上一篇
203. 移除链表元素 203. 移除链表元素
本题来自 LeetCode:203. 移除链表元素[1] 题目描述删除链表中等于给定值 val 的所有节点。示例: 输入: 1-2-6-3-4-5-6, val = 6 输出: 1-2-3-4-5 题目分析采用单指针遍历链表,判断下一个
2021-04-05
下一篇 
14. 最长公共前缀 14. 最长公共前缀
本题来自 LeetCode:14. 最长公共前缀[1] 题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例  1: 输入: ["flower","flow","fligh
2021-04-05