题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

注意:题目中要求的排序算法为稳定排序
解法一:移动覆盖
非零前移,最后补零。使用双指针,一个表示非零所在位置,一个遍历数组。
class Solution {
public void moveZeroes(int[] nums) {
int len = nums.length;
int p = 0;//不是0的位数指针
int n = 0;//0的个数
for(int i = 0;i < len;i++){
if(nums[i] != 0){//只要不是0就往前移
nums[p++] = nums[i];
}
else{
n++;
}
}
for(int i = len-n;i < len;i++){
nums[i] = 0;
}
}
}
解法二:移动交换
采用双指针算法,一个移动找0,找到0就和前面不为0指针所指的数交换。
class Solution {
public void moveZeroes(int[] nums) {
int head = 0; //记不为0的位置
int temp;
for(int i = 0;i < nums.length;i++){
if(nums[i] != 0){
temp = nums[head];
nums[head++] = nums[i];
nums[i] = temp;
}
}
}
}
本文介绍了一种将数组中所有零移动到末尾同时保持非零元素相对顺序的算法。该算法分为两部分:移动覆盖和移动交换。通过双指针技术实现高效原地操作。
540

被折叠的 条评论
为什么被折叠?



