283.移动零
一、题目
给定一个数组nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
二、相关链接
- 题目链接:https://leetcode-cn.com/problems/move-zeroes/
- 参考题解:https://leetcode-cn.com/problems/move-zeroes/solution/dong-hua-yan-shi-283yi-dong-ling-by-wang_ni_ma/
三、解题思路
- 解法:双指针
- 思路:用两个指针,一个遍历数组,一个指向第一个0下标(用于交换数)
- 步骤:
- 1.定义移动指针i=0,指向第一个0的下标j=0
- 2.i从0遍历到nums末尾,当nums[i]不为0时,与nums[j](第一个0)交换,同时j右移
四、代码
class Solution {
public void moveZeroes(int[] nums) {
//指向第一个0的下标
int j = 0;
//游动指针从头到尾
for (int i = 0;i<nums.length;i++) {
//如果当前数为0,就i+1,j不变
if(nums[i] != 0) {
//调换i和j位置的数
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
//j+1(第一个0的下标)
j+=1;
}
}
}
}
五、总结
- 难度:中等(没有这个思路/思维,需要重做)