力扣: 一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

该题核心步骤在于:(数组中是无法删除元素的,只能是覆盖,也就是将后面值依次赋予前一个值)

用哪一种方法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; // 返回删除指定元素后的数组长度
}

运行结果如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值