这个题目自己做的时候写出来了,但网站一直过不了,
#include<stdio.h>
int a[100];
int flag[100];
int main()
{
int N,num;
scanf("%d",&N);
for(int i=0; i<N; i++)
scanf("%d",&a[i]);
for(int i=0; i<N-1; i++)
for(int j=i+1; j<N; j++)
if(a[i]>a[j])
{
int t=a[j];
a[j]=a[i];
a[i]=t;
}
for(int i=0; i<N-1; i++)
for(int j=i+1; j<N; j++)
if(a[i]==a[j])
{
flag[i]=1;
num++;
N--;
}
printf("%d\n",N);
for(int k=0; k<N+num; k++)
{
if(!flag[k])
{
printf("%d ",a[k]);
}
}
printf("\n");
return 0;
}
讲一下自己的部分思路,在第一个两重循环这里我想用选择排序(可以去b站学)先对这个数组排序,第二个俩重循环是比较有没有相等的,,有的话就标记其中一个,并进行计数,同时要输出的数也要减,这里小小的模拟一下:
写到这里,我仿佛明白自己为什么一直过不了了--标记错了,如果标记i的话要是这数组里面有多于两个的重复数字,也就只能删一个(这里解释一下两重循环的工作原理:举个例子介绍:
即每进行一个大循环自增就要进行小循环到结束,在这里就是在i=0时要经历一遍让j等于一到九,然后经历一个i=1的大循环时同时小循环里要经历过让j等于i+1即2到9,以此类推。)所以我更新一下代码:
#include<stdio.h>
int a[100];
int flag[100];
int main()
{
int N,num;
scanf("%d",&N);
for(int i=0; i<N; i++)
scanf("%d",&a[i]);
for(int i=0; i<N-1; i++)
for(int j=i+1; j<N; j++)
if(a[i]>a[j])
{
int t=a[j];
a[j]=a[i];
a[i]=t;
}
for(int i=0; i<N-1; i++)
for(int j=i+1; j<N; j++)
if(a[i]==a[j])
{
flag[j]=1;
num++;
N--;
}
printf("%d\n",N);
for(int k=0; k<N+num; k++)
{
if(!flag[k])
{
printf("%d ",a[k]);
}
}
printf("\n");
return 0;
}
但我们学校的刷题网站上还是显示运行错误。但是我还是要把我的思路讲完:
在最后一个循环里面,我想在刚开始的数组数量里面把相应标记为一的筛掉,只打印标记为零的,可能有人有疑问,反正本来就只要打印八个,为什么还要把条件设为十呢?其实我刚开始也是这样想的,但是结果是错的哦!
这是因为我虽然把重复的标记为一,但是并没有真的把它删掉,,只是选择性输出了,并没有将其序号左移或右移,如果这时候我输出的时候把原本的序号减少了,就会有些输不出。
由于自己的代码一直过不了只能去学别人的代码了:
#include <stdio.h>
int arr[1001];
int main()
{
int n;
scanf("%d",&n);
int c=0;
int temp;
for(int i=0;i<n;i++){
scanf("%d",&temp);
arr[temp]++;
}
for(int i=0;i<1001;i++){
if(arr[i]==1){
c++;
}
if(arr[i]>1){
arr[i]=1;
c++;
}
}
printf("%d\n",c);//输出排序后的个数
for(int i=0;i<1001;i++){
if(arr[i]==1)
printf("%d ",i);
}
return 0;
}
这里定义数组总是要大一点好一些,当然,大数组最好定在外面作为全局变量, 本来自己想理解一下这里arr[temp]++的:
后来看了注释才知道完全理解错了意思,在arr[temp]++这里,应该来说是这样的原理,刚刚给arr数组所有的都赋值为零,现在把一个数放进arr作为序号,每放一个,它的值都是零,然后再自增为一,及把输入的数都标记为一,而如果有重复的就不只为一,而在下面的循环,第一个条件是对输入的值进行计数,当然对重复的就要多记一个数,在这里我又开始想了,为什么直接变成一呢,为什么不能减一,万一有很多个重复的咋办。然后问了学长后,还是我草率了,原来这里不管它是大于一还是等于一,都只计一个数。这样才真的达到了去重的目的。学长说这个代码还可以精简一下比如这样:
#include <stdio.h>
int arr[1001]= {0};
int main()
{
int n;
scanf("%d",&n);
int count=0;
int temp;
for(int i=0; i<n; i++)
{
scanf("%d",&temp);
arr[temp]=1;//储存元素
}
for(int i=0; i<1001; i++)
if(arr[i]==1)
count++;
printf("%d\n",count);
for(int i=0; i<1001; i++)
{
if(arr[i]==1)
printf("%d ",i);
}
return 0;
}
我之前很喜欢在这个平台上复制粘贴代码,但是编译器实际却用不了,那可能是因为粘贴的时候会带有某些中文格式,这时候还是自己手动输入比较好。
最后,再小小激励一下自己:玉渊潭洋槐花盛开,像下了一场大雪,白得耀眼。 有没有感觉被这种意境美到?