文章目录
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。
![](https://img-blog.csdnimg.cn/12f74d535ad74ee9ac8c4f301a149108.jpeg#pic_cente)
前言
本篇是对数组中删除指定的数,结合自己思路,牛客大佬的思路,总结的一篇文章,希望能拓展小伙伴们的思路,如有错误,请在评论区指正,让我们一起交流,一起共同进步! |
本文开始
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;
}
总结
✨✨✨各位读友,本篇分享到内容是否更好的让你拓展自己的思路呢?如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!