目录
题目详情:
在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。
输入格式:
你的程序首先会读到一个正整数n,n∈[1,100000],然后是n个整数。
输出格式:
如果这些整数中存在重复的,就输出:
YES
否则,就输出:
NO
输入样例:
5
1 2 3 1 4
输出样例:
YES
思路:
将一大堆数据放入数组中,这样有利于比较喽,查重。
遇到的问题:
按照常规操作,读取数组,遍历数组,不可以,运行超时,还搞不懂怎么减少运行时间
错误原因:
运行超时
错误代码:
代码一:
先读取数据,后双层循环判断重复数据,一遇到重复数据就跳出循环。
因break可以跳出距离它最近的循环,可以用flag标记进而跳出外层循环。
但是尽管这样还是运行超时,可能对于一组没有重复数据的数组运行时间过长。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int c,d;int flag=0;
for(c=1;c<=n;c++)
{
for(d=c+1;d<=n;d++)
{
if(a[c]==a[d])
{
flag=1;
break;
}
}
if(flag)
break;
}
if(flag)
printf("YES");
else
printf("NO");
return 0;
}
代码二:
通过代码一,我在网上进行搜索,发现了另一种比较方法,于是又修改了代码一。
此代码与代码一相比,双层循环的比较方式有所不同。
代码一:先确定一个数据,用此数据与在他之后的数据进行比较。
代码二:同样先确定一个数据,用此数据与在他之前的数据进行比较;但是仍然运行超时。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
int flag=0;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
if(flag==0)
{
for(int j=1;j<i;j++)
{
if(a[i]==a[j])
{
flag=1;
break;
}
}
}
}
if(flag)
printf("YES");
else
printf("NO");
return 0;
}
改正后:
这是根据代码二进行修改的,代码二的与选定的数据之前的数据进行比较,应该是为了一遍读取数据一遍进行查找重复数据。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[n+1];
int flag=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(flag==0)
{
for(int j=1;j<i;j++)
{
if(a[i]==a[j])
{
flag=1;
break;
}
}
}
}
if(flag)
printf("YES");
else
printf("NO");
return 0;
}
学习体会:
减少循环,继续学习啊!