思路:
由于题目要求原地删除指定元素,所以只能再题目提供的数组进行操作,而不能创建新的数组。
这时我们应该利用多个下标的一起遍历数组的方法。
具体操作参考以下代码和对应注释:
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int val = 0;
scanf("%d", &val);//指定要删除的元素
int real = 0;
int cur = 0;
int i = 0;
int count = sz;
while (i < sz)//遍历数组
{
//如果该元素不是需要删除的元素,则把它赋值给arr数组下标为real的位置,覆盖下标real本身
//的内容,i下标往下走继续遍历,real坐标也需要往下走
if (arr[i] != val)
{
arr[real] = arr[i];
i++;
real++;
}
//遇到需要删除的元素则无需赋值给arr数组下标为real的位置,i继续往下走,直到遇到不是要删
//除的元素。
else
{
i++;
count--;//count一开始等于sz,每删除一个元素count--,最后得到删除指定元素之后剩余
//的元素个数
}
}
for (i = 0; i < count; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
如果力扣上做题应写成如下形式:
int removeElement(int* arr, int sz, int val)
{
int real=0;
int cur=0;
int count=sz;
while(cur<sz)
{
if(arr[cur]!=val)
{
arr[real]=arr[cur];
real++;
cur++;
}
else
{
cur++;
count--;
}
}
return count;
}