使用C语言和JAVA代码通过双指针进行解题
题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
理解题意:不改变数组中非零元素的顺序,并把0元素放在非零元素后面.
链接: https://leetcode.cn/problems/move-zeroes/submissions/518522448/
双指针解法:定义两个下标(dest,cur)来对数组进行划分区间,保持区间[0,dest]已经确定非零,[dest + 1,cur - 1]为0区间.后面为未处理区间[cur,数组长度 - 1].当下标划分的未处理区间全部遍历完成,证明元素已经全部处理好.
解题步骤:1.创建两个下标(dest,cur)来进行划分区间
2.需要进行多次判断cur,dest下标情况,则使用循环,并当cur < 数组长度 - 1时证明判断结束
3.当cur下标对应值为0时,cur++把对于下标值值放到[dest + 1,cur - 1]区间,cur下标对应值为非零值时,把该下标对应值放入[0,dest]区间(交换).
C语言代码:
void moveZeroes(int* nums, int numsSize) {
//1.设计两个元素,dest:目标下标 cur:当前下标
//2.划分区间,进行循环,当cur遍历完,证明已经全部排序完成
//3.进行判断cur下标对应的值是0||非0值,如果为0++,非0,dest++,并且两者进行交换
int dest = -1;
int cur = 0;
while(cur < numsSize) {
if(nums[cur] == 0) {
cur++;
}else {
int tmp = nums[dest + 1];
nums[dest + 1] = nums[cur];
nums[cur] = tmp;
dest++;
cur++;
}
}
}
JAVA代码如下:
class Solution {
public void moveZeroes(int[] nums) {
int dest = -1;
int cur = 0;
while(cur < nums.length) {
if(nums[cur] == 0) {
cur++;
}else {
int tmp = nums[cur];
nums[cur] = nums[dest + 1];
nums[dest + 1] = tmp;
cur++;
dest++;
}
}
}
}