【有重复数据】

目录

题目详情:

输入格式:

输出格式:

输入样例:

输出样例:

思路:

遇到的问题:

错误原因:

错误代码:

 改正后:

学习体会:


题目详情

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“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;
}

学习体会

减少循环,继续学习啊!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值