思路:
由于题目要求原地删除指定元素,所以只能再题目提供的数组进行操作,而不能创建新的数组。
这时我们应该利用多个下标的一起遍历数组的方法。
具体操作参考以下代码和对应注释:
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; }