练习题--序列中删除指定数字 --五种思路帮助思考

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。


前言

本篇是对数组中删除指定的数,结合自己思路,牛客大佬的思路,总结的一篇文章,希望能拓展小伙伴们的思路,如有错误,请在评论区指正,让我们一起交流,一起共同进步!

本文开始

1. 序列中删除指定数字

题目描述:
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
数据范围:序列长度和序列中的值都满足 1≤n≤50
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。

示例1:
输入:
6
1 2 3 4 5 9
4
输出:
1 2 3 5 9
示例2:
输入:
5
1 2 3 4 6
5
输出:
1 2 3 4 6

方法一 (不建议使用):直接打印需要的数字

思路:对于存放一组数,我们需要用到数组,既然要输出删除之后的序列(数组),==我们可以不打印删除的数,直接打印我们需要的数== .
  • 缺点:但是这个方法算是投机取巧,并没有真正意义上在数组中删除指定的数字.
#include<stdio.h>
int main()
{
    int n=0;
    //输入
    scanf("%d",&n);
    int arr[n];//变长数组存储
    int i=0;
    //在数组中存入数据
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //要查找删除的数字
    int del=0;
    scanf("%d",&del);
    for(i=0;i<n;i++)
    {
        //在数组中,当数组中的数不等于要删除的数就打印
        if(arr[i]!=del)
        {
              printf("%d ",arr[i]);
        }
    }
    return 0;
}

方法二:操作两个数组

思路:利用两个数组,数组1存储数据,数组2只存储需要打印的数据. 遍历数组1,当遇到要删除的数字就跳过,把需要打印的数字放到数组2中,最后打印数组2.
  • 缺点:不是在一个数组中操作,没有真正意义上在一个数组中删除数据.
#include<stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int i=0;
 //可以用变长数组也可以自己输入,
//根据题目条件,数组最长50,所以创建50的数组足够用
    int arr1[50]={0};
    int arr2[50]={0};
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr1[i]);
    }
    //输入想要删除的数
    int del=0;
    scanf("%d",&del);
    int j=0;
    int count=0;
    //遍历数组
    for(i=0;i<n;i++)
    {
        //当不为要删除的数就存进数组2
        if(arr1[i]!=del)
        {
          arr2[j++]=arr1[i];
            count++;//计算数组长度
        }
    }
    for(j=0;j<count;j++)
    {
        printf("%d ",arr2[j]);
    }
    return 0;
}

方法三:下标前移一位(建议使用)

设要删除数字的下标为 j
思路:
在一个数组中,当遇到要删除的数字(j位置),①利用循环把删除数字后面(j+1后面的数)的数字往前移动1(arr[j]=arr[j+1]),②但是不知道移动后j的位置,是否为要删除的数,这是我们就需要j–,在遍历时从j的位置重新查找,防止漏掉删除的值.

例如:要删除5
arr:1 2 3 4 5 5 9
这种情况就需要j–下标前移重新遍历arr[j]的值

优点:利用count来删除,因为每删除一位就会少打印一位和少移动一位

代码如下:

#include<stdio.h>
int main()
{
    int n=0;
    //输入
    scanf("%d",&n);
    int arr[n];//变长数组存储
    int i=0;
    //在数组中存入数据
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //要查找删除的数字
    int del=0;
    scanf("%d",&del);
    int count=n;
//利用count来删除,因为每删除一位就会少打印和少移动一位
    for(i=0;i<n;i++)
    {
        if(arr[i]==del)
        {
            int j=0;
// 把删除数字后面(j+1后面的数)的数字往前移动
             for(j=i;j<count;j++)
             {
                arr[j]=arr[j+1];
             }
             count--;
//删除一次就少打印一次,移动时也少移动一位
            i--;//回i-1的位置,到i++就重新访问i位置的值是否为要删的数
        }
    }
    //打印删除后的数组
    for(i=0; i<count; i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

方法四:双下标指向一个数组(建议使用)

思路: 创建一个数组,指定两个下标 i 和 j ,通过 i 遍历数组,①如果不是要删除的数字,就将下标 i 给 j ,②如果通过 i 访问的值为删除的值,i++不用将 i 给 j 直接++,当不是要删除的值时,再将 i 给 j ;

黄色为不能让arr[i]的值给arr[j]

优点:
利用双坐标与方法三相比,不用下标在遇到要删除的数时,不用i–重新访问i下标所对应的值.
<font

#include<stdio.h>
int main()
{
    int n=0;
    //输入
    scanf("%d",&n);
    int arr[n];//变长数组存储
    int i=0;
    //在数组中存入数据
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //要查找删除的数字
    int del=0;
    scanf("%d",&del);
    int j=0;
    for(i=0;i<n;i++)
    {
        //下标i的值不为删除值,i就给j
        if(arr[i]!=del)
        {
            arr[j]=arr[i];
            j++;//计算几个元素
        }
    }
    for(i=0;i<j;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

方法五:删除的值赋0

遍历整个数组,遇到要删除的数时,①用0覆盖删除的值,②再用数组的值为判断条件打印数组值.

优点:
思路巧妙,让要删除的为0,并让其打印时为判断真假的条件.
缺点:没有真正意义上删除值.

代码演示

#include<stdio.h>
int main()
{
    int n=0;
    //输入
    scanf("%d",&n);
    int arr[n];//变长数组存储
    int i=0;
    //在数组中存入数据
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    //要查找删除的数字
    int del=0;
    scanf("%d",&del);
    for(i=0;i<n;i++)
    {
        //下标i的值赋值0
        if(arr[i]==del)
        {
            arr[i]=0;
        }
    }
    for(i=0;i<n;i++)
    {
        //值为判断真假的条件
        if(arr[i])
        {
            printf("%d ",arr[i]);
        }
    }
    return 0;
}

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你拓展自己的思路呢?如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值