1145: 零起点学算法52——数组中删数II
Description
在给定的数组中删除数
Input
多组测试,每组第一行输入1个整数n(n<20),然后是n个整数
第二行输入1个整数m
Output
删除在第一行的n个整数中的数字m(多个的话都要删除),然后按照顺序输出剩下的数。如果该数组中所有数均被删除,请直接输出换行
" class="reference-link">Sample Input 
5 1 2 3 4 3
3
Sample Output
1 2 4
Source
零起点学算法
Code
一开始还是想用上一题的思路然后直接去掉break,后来发现因为我删除的思路是所有元素往前移,因此在下一轮遍历的时候紧挨着的元素会直接被跳过。当相同的元素挨在一起时便无法删除第二个,不相邻时才可以被删除。于是这一题选择使用一个新数组来存放没有被删除的元素。
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[n];
for(int i=1;i<=n;i++)
cin>>a[i];
int m;
int t=0;
cin>>m;
for(int j=1;j<=n;j++)
{
if(a[j]==m)
t++;
}
int b[n];
for(int i=1;i<=n;i++)
{
if(a[i]!=m)
b[i]=a[i];
}
if((n-t)!=0)
{
for(int j=1;j<=n-t-1;j++)
cout<<b[j]<<" ";
cout<<b[n-t]<<endl;
}
else
cout<<endl;
}
}
上面的代码实在是太复杂了, 而且这样做的时候很容易变量之间的关系弄错,什么n-t-1之类的。我记录的是需要删除的元素个数,但是实际上记录无需删除的元素个数更加简单,这个变量可以直接作为b数组的长度。于是有了下面的代码。
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[20],b[20];
///录入a数组
for(int i=0;i<n;i++)
cin>>a[i];
int m;
int t=0;
cin>>m;
for(int j=0;j<n;j++)
{
if(a[j]!=m)///不是相同的元素
{
b[t]=a[j];
t++;///无需删除的元素个数
}
}
if(t!=0)
{
for(int j=0;j<t-1;j++)
cout<<b[j]<<" ";
cout<<b[t-1]<<endl;
}
else
cout<<endl;
}
}
还没有评论,来说两句吧...