给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
简单版
将所有非0元素提取出来存入集合中,按顺序填充,未填充部分都填充0即可
public void moveZeroes(int[] nums) {ArrayList<Integer> noneZeroList = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {noneZeroList.add(nums[i]);}}for (int i = 0; i < noneZeroList.size(); i++) {nums[i] = noneZeroList.get(i);}for (int i = noneZeroList.size(); i < nums.length; i++) {nums[i] = 0;}}
将三个for循环优化成两个for循环,但总体效率一样,使用一个List存非0数,一个list存0,然后将两个list聚合
public void moveZeroes(int[] nums) {ArrayList<Integer> noneZeroList = new ArrayList<>();ArrayList<Integer> zeroList = new ArrayList<>();for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {noneZeroList.add(nums[i]);} else {zeroList.add(nums[i]);}}noneZeroList.addAll(zeroList);for (int i = 0; i < noneZeroList.size(); i++) {nums[i] = noneZeroList.get(i);}}
优化版
不需要新建一个List,定义一个整型变量index用于保存非0数的个数
public void moveZeroes(int[] nums) {int index = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {nums[index] = nums[i];index++;}}for (int i = index; i < nums.length; i++) {nums[i] = 0;}}
交换法
将非0数和0交换位置,定义一个变量index用于记录0的下标,遍历到非0数就交换
public void moveZeroes(int[] nums) {int index = 0;for (int i = 0; i < nums.length; i++) {if (nums[i] != 0) {swap(nums, i, index++);}}}public static void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}
