题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes/
著作权归领扣网络所有。
栗子1:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
思路:
这是一道典型的双指针题目,P指针用来遍历数组,Q指针用来移动非零元素。最后进行置零操作。
如果有什么错误或者问题,欢迎评论,我们一起探讨,一起进步。
拓展:
双指针在算法中是很常见的,与其说它是一种算法,倒不如说它是一种技巧、一种思想。
常见的几种分类有:
- 快慢指针
- 相向指针
- 滑动窗口
快慢指针:
这种类型使用的两个指针,一个用于数组的迭代,一个用于对应题意的操作。
相向指针:
往往一个指针指向数组的开头,一个指针指向数组的结尾,两个指针向数组中间进行移动,直到两个指针相遇。
滑动窗口:
两个指针会组成一个窗口,或者说区间,然后去移动,进行一些操作。
如果你想尝试相关的题目,可以使用LeetCode探索中“数组和字符串”的卡片,里面不仅有入门的题目,还有一些引导,非常适合初学者。
代码:
public void moveZeroes(int[] nums) {
int p = 0;
int q = 0;
while (p < nums.length) {
if (nums[p] != 0) {
nums[q] = nums[p];
q++;
}
p++;
}
//置零操作
for (int i = nums.length - (p - q); i < nums.length; i++) {
nums[i] = 0;
}
}