1145: 零起点学算法52——数组中删数II

悠悠 2023-01-10 14:50 316阅读 0赞

Description

在给定的数组中删除数

Input

多组测试,每组第一行输入1个整数n(n<20),然后是n个整数
第二行输入1个整数m

Output

删除在第一行的n个整数中的数字m(多个的话都要删除),然后按照顺序输出剩下的数。如果该数组中所有数均被删除,请直接输出换行

" class="reference-link">Sample Input 5f8f312f51791b8bb0ed0ae07c2ffa43.gif

  1. 5 1 2 3 4 3
  2. 3

Sample Output

  1. 1 2 4

Source

零起点学算法

Code

一开始还是想用上一题的思路然后直接去掉break,后来发现因为我删除的思路是所有元素往前移,因此在下一轮遍历的时候紧挨着的元素会直接被跳过。当相同的元素挨在一起时便无法删除第二个,不相邻时才可以被删除。于是这一题选择使用一个新数组来存放没有被删除的元素。

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. while(~scanf("%d",&n))
  8. {
  9. int a[n];
  10. for(int i=1;i<=n;i++)
  11. cin>>a[i];
  12. int m;
  13. int t=0;
  14. cin>>m;
  15. for(int j=1;j<=n;j++)
  16. {
  17. if(a[j]==m)
  18. t++;
  19. }
  20. int b[n];
  21. for(int i=1;i<=n;i++)
  22. {
  23. if(a[i]!=m)
  24. b[i]=a[i];
  25. }
  26. if((n-t)!=0)
  27. {
  28. for(int j=1;j<=n-t-1;j++)
  29. cout<<b[j]<<" ";
  30. cout<<b[n-t]<<endl;
  31. }
  32. else
  33. cout<<endl;
  34. }
  35. }

上面的代码实在是太复杂了, 而且这样做的时候很容易变量之间的关系弄错,什么n-t-1之类的。我记录的是需要删除的元素个数,但是实际上记录无需删除的元素个数更加简单,这个变量可以直接作为b数组的长度。于是有了下面的代码。

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4. int main()
  5. {
  6. int n;
  7. while(~scanf("%d",&n))
  8. {
  9. int a[20],b[20];
  10. ///录入a数组
  11. for(int i=0;i<n;i++)
  12. cin>>a[i];
  13. int m;
  14. int t=0;
  15. cin>>m;
  16. for(int j=0;j<n;j++)
  17. {
  18. if(a[j]!=m)///不是相同的元素
  19. {
  20. b[t]=a[j];
  21. t++;///无需删除的元素个数
  22. }
  23. }
  24. if(t!=0)
  25. {
  26. for(int j=0;j<t-1;j++)
  27. cout<<b[j]<<" ";
  28. cout<<b[t-1]<<endl;
  29. }
  30. else
  31. cout<<endl;
  32. }
  33. }

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读