LeetCode精选TOP面试题283. 移动零

题目描述

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

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

要求:
1.必须在原数组上操作,不能拷贝额外的数组。
2.尽量减少操作次数。

解题思路

思路1:先复制最后置0,复制完成后数组中没有0元素
两个标志位同时向后移动,遇到非零元素则将其向前复制,最后当第一个标志位到数组末尾时,将两个标志位之间的元素全部置0。
思路2:一边遍历一边交换,始终保持原数组本身的数据组成
两个标志位同时先后移动,遇到非零元素则将两个标志位所指向的元素互换(此时会包含两个标志位指向同一个元素,本身和本身互换的情况,对算法本身没有影响),遍历到最后,零元素就全部位于数组末尾了。
以上两种思路均能保持非零元素的相对顺序

思路3:利用辅助数组
这个比较好理解,遇到非零元素就复制到新数组,剩下的位补0,但是这是违背要求的。

代码实现(Java)

// 思路1:先复制最后置0,复制完成后数组中没有0元素
public class Solution {
    public void moveZeros(int[] nums){
        int len = nums.length;
        if (len == 0){
            return;
        }
        int count = 0;
        for (int i = 0; i < len; i++){	// 先复制
            if (nums[i] != 0){
                nums[count++] = nums[i];
            }
        }
        // 此时数组中没有0元素了
        for (int i = count; i < len; i++){// 然后置末尾的i 和j之间的元素全为0
            nums[i] = 0;
        }
    }
}
// 思路2::一边遍历一边交换,始终保持原数组本身的数据组成
public class Solution {
    public void moveZeros(int[] nums){
        int len = nums.length;
        if (len == 0){
            return;
        }
        int i, j = 0;
        for (i = 0; i < len; i++){
        	// 交换呀交换,只要遇到0元素,i和j总能错开的,所有肯定保证非零元素和零元素的交换
            if (nums[i] != 0){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j++] = temp;
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章