一、问题
https://leetcode-cn.com/problems/move-zeroes/
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
二、GitHub实现:https://github.com/JonathanZxxxx/LeetCode/blob/master/MoveZeroesClass.cs‘’
Blog:https://www.cnblogs.com/zxxxx/
三、思路
index标识非零的个数,循环遍历数组;如果不是0,就将非零的值移到index位,index加一;遍历结束后,再次遍历,index后的位置都为0
优化思路:不需要第二次遍历,第一次遍历数组时判断下标是否等于index,不等于就将当前值置为零
四、代码实现
public class MoveZeroesClass { public void MoveZeroes(int[] nums) { if (nums == null || nums.Length == 0) return; //非零个数 var count = 0; for (int i = 0; i < nums.Length; i++) { //非零值移到当前指针位置 if (nums[i] != 0) { nums[count] = nums[i]; count++; } } //当前指针位置后都为0 for (int i = count; i < nums.Length; i++) { nums[i] = 0; } } public void MoveZeroes2(int[] nums) { if (nums == null || nums.Length == 0) return; var current = 0; for (int i = 0; i < nums.Length; i++) { if (nums[i] != 0) { nums[current] = nums[i]; //num[i]值置0 if (current != i) { nums[i] = 0; } current++; } } } }