给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
法一:
void moveZeroes(int* nums, int numsSize){
int i,j,k=numsSize-1;
for(i=numsSize-1;i>=0;i--)//按逆序遍历每个元素
{
if(nums[i]==0)//遍历过程中,若碰到nums[i]为0,将[i,numsSize-1]元素全部前移,并使nums[numsSize-1]元素为0,同时下一次若发生相同情况,则将0赋给nums[numsSize-2],以此类推
{
for(j=i;j<numsSize-1;j++)
{
nums[j]=nums[j+1];
}
nums[k]=0;
k--;
}
}
return nums;
}
法二:
int removeElement(int* nums, int numsSize, int val)//利用双指针将数值为val的元素移除
{
int i, j = 0;
for (i = 0; i < numsSize; i++)
if (nums[i] != val)
{
nums[j] = nums[i];//当循环条件成立,nums[i]处的值不发生改变;当循环条件不成立,i++,j不变
j++;
}
return j;//返回的j即为当前数组的长度
}