来自编程语言初学练习赛第七场H题,题目如下
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。这是我写的代码,并未通过.....(我果然很菜)
#include"stdio.h" #define N 51 int main() { int delet; int t; int i,j,n; int a[N]; for(int i=0;i<51;i++) a[i]=1000; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=1;i<=n-1;i++) { for(j=0;j<n-i;j++) { if(a[j]>a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } scanf("%d",&delet); for(i=0;i<n;i++) { if(a[i]==delet) { for(j=i;j<=n;j++) a[j]=a[j+1]; n--; i=0; } } for(j=0;j<n;j++) printf("%d ",a[j]); }自测没问题,OJ不过那就是OJ的问题(疯狂骗自己)
以下是某不知名的dalao那里复制的AC代码(膜拜dalao)
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = 0, m = 0; n = sc.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++){ arr[i] = sc.nextInt(); } m = sc.nextInt(); List<Integer> list = removeTargetNum(arr,m); for(Integer i : list){ System.out.print(i + " "); } } public static List<Integer> removeTargetNum(int[] arr,int m){ if(arr==null){ return null; } List<Integer> list = new ArrayList<>(); for(int i : arr){ if(i!=m){ list.add(i); } } return list; } }恕我无能,暂时还看不懂JAVA(QAQ)
我的思路是,先将数组中的数与要删除的数作比较,找到相等的数后直接,让后面的每一个数赋值给前一个,这样就覆盖了要删除的数,以此类推,会删掉所有要删除的数
然而现实很残酷......
哪里出了bug呢.......在敲这篇文章的同时我又去康了一下......发现个问题......
我在if语句的最后将i重新归零,但我忘了i++这个讨厌的东西.....
它导致我的i并没有归0而是归了1......
我机制地把i=0改成了i=-1.....(哈哈哈不愧是我)
以下是我的AC代码......(没想到敲文章也能过题.....)
#include"stdio.h" #define N 51 int main() { int delet; int t; int i,j,n; int a[N]; for(int i=0;i<51;i++) a[i]=1000; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&delet); for(i=0;i<n;i++) { if(a[i]==delet) { for(j=i;j<=n;j++) a[j]=a[j+1]; n--; i=-1; } } for(j=0;j<n;j++) printf("%d ",a[j]); }这i++,给了我多少个小时的罚时..............(我没有生气!)