目录
题目:
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。假设
nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。返回
k
。
思想:双指针(快慢指针)
快指针用来遍历数组;慢指针用来记录新数组(也就是移除元素后的数组);
快指针一直在寻找可以放进新数组的元素,慢指针一直停留在接收下一个新元素的下标哦!
当快指针找到一个符合新数组的元素时,(即当前的元素不等于val),就把这个值赋给慢指针所指向的位置,然后慢指针向前移动一个位置,因为要接受下一个满足新数组的位置。
但是主要新数组和旧数组实际上是一个数组,新数组一直在改变。
代码实现
#include <stdio.h>
#include <stdlib.h>
int main(){
printf("请输入数组的个数:");
int n ;
int val;
scanf("%d",&n);
printf("请依次输入每个元素:");
int* nums = (int*)malloc(sizeof(int) * (n));
for(int i = 0; i < n; i ++ ){
scanf("%d",&nums[i]);
}
printf("请输入要移动的元素:");
scanf("%d",&val);
int slow = 0;
int fast = 0;
for( fast = 0; fast < n; fast++){
if(nums[fast] != val){
nums[slow ++] = nums[fast];
}
}
for(int i = 0 ; i<n; i ++){
printf("%d ",nums[i]);
}
return 0;
}