Every day a leetcode
题目来源:283. 移动零
解法1:模拟
建立一个指针index,初始化为0。
遍历数组,对于每一个元素nums[i],若它不为0,则插入到前面的nums[index],index++。
最后在数组的末尾添上0。
代码:
void moveZeroes(int* nums, int numsSize){
int index=0;
for(int i=0;i<numsSize;i++)
{
if(nums[i]!=0)
{
nums[index++]=nums[i];
}
}
while(index<numsSize)
{
nums[index++]=0;
}
}
解法2:双指针法
使用双指针,左指针left指向当前已经处理好的序列的尾部,右指针right指向待处理序列的头部。
右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。
每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
另外,还有以下性质:
- 左指针左边均为非零数;
- 右指针左边直到左指针处均为零。
代码:
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
void moveZeroes(int* nums, int numsSize){
int left=0;
int right=0;
while(right<numsSize)
{
if(nums[right]!=0)
{
swap(&nums[left],&nums[right]);
left++;
}
right++;
}
}
结果: