该题核心步骤在于:(数组中是无法删除元素的,只能是覆盖,也就是将后面值依次赋予前一个值)
用哪一种方法1.暴力分解法,也就是双重循环直接进行对目标值的覆盖,第一次进行遍历循环,找到与目标值相等,二次遍历是将值进行覆盖;
以下代码以第二种为例,第二种代码简单,思路复杂;
2.双指针法,双指针是指一个快指针(这里的指针特指数组)先进行遍历,找到与目标值不相等的值赋予慢指针,慢指针是用来保存删选后的数组;
**:对于数组来讲,数组地址就是数组自身名,指针传地址时不用再取地址;int a[];
传地址时直接传a,即可;
对于什么时候使用指针要点: 如果对修改后的值需要带回去就需要用到指针;
下图为函数的代码:
#include<stdio.h>
// 声明一个函数delet,用于删除数组中的指定元素
int delet(int a, int *b, int c);
int main(){
int a[9] = { 1,2,2,5,6,7,8,9,11 }; // 初始化一个整型数组a
int target=0,back=1,hum=0; // 声明并初始化一些变量
printf("输入一个目标值");
scanf("%d", &target); // 从用户输入读取目标值
hum = sizeof(a) / sizeof(int); // 计算数组a的长度
back= delet(target,a,hum); // 调用delet函数,返回删除指定元素后的数组长度
for(int k=0;k<back;k++) {
printf(" %d",a[k]); // 输出删除指定元素后的数组元素
}
printf("返回后的数组长度是%d",back); // 输出返回后的数组长度
return 0;
}
// 定义delet函数,删除数组中的指定元素
int delet(int a,int *b, int c){
int slow=0; // 定义一个慢指针,指向下一个要替换的位置
for (int i = 0; i < c; i++){
if(b[i]!=a){
b[slow]=b[i]; // 将不等于指定元素的元素替换到慢指针所指向的位置
slow++; // 慢指针向后移动一位
}
}
return slow; // 返回删除指定元素后的数组长度
}
运行结果如下: