ARookie1234 2020-05-24 19:01 采纳率: 100%
浏览 659
已采纳

运行时间过长,请修改代码降低程序运行时间

有N个字符串,从前到后的顺序依次进行识别,若该字符串在之前未出现过(不区分大小写),则输出Yes,否则输出No

输入格式:

   第一行为N,表示有N个字符串,接下来N行均为长度不超过100的字符串。

输出格式:

        输出共N行,第 i 行输出表示第 i 个字符串之前是否出现过。

代码如下:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define maxm 100000
#define maxn 105

typedef struct node
{
    char name[maxn];
    struct node *next;
}linknode, *link;

void main()
{
    link p, q;
    int N, i, j;
    char temp[maxn];
    link user[maxn];
    for(i=0;i<maxn;i++)
        user[i]=NULL;
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%s",temp);
        p=(link)malloc(sizeof(linknode));
        p->next=NULL;
        strcpy(p->name, temp);
        if(user[strlen(p->name)]==NULL)
        {
            user[strlen(p->name)]=p;
            printf("No\n");
        }
        else
        {
            q=user[strlen(p->name)];
            while(q!=NULL)
            {
                if(!strcasecmp(q->name,p->name))
                {
                    printf("Yes\n");
                    break;
                }     
                else if(q->next==NULL)
                {
                    q->next=p;
                    printf("No\n");
                    break;
                }
                q=q->next;
            }
        }
    }
}
  • 写回答

2条回答 默认 最新

  • qybao 2020-05-25 17:44
    关注

    不需要用链表,用动态数组就可以了,尽量问题简单化
    用一个数组来保存key,每次输入的时候从key里查询有没有重复就可以了

    typedef struct {
        char data[101];
        char result[4];
    } Data;
    int main ()
    {
        int N, i, j, k=0;
        scanf("%d",&N);
        char (*keys)[101] = (char(*)[101])malloc(sizeof(char[101])*N); //记录没有重复的key
        Data *data = (Data*)malloc(sizeof(Data)*N);
        for (i=0; i<N; i++) {
            scanf("%s", data[i].data);
            for (j=0; j<k; j++) { //遍历key查找是否有重复数据
                if (strcasecmp(data[i].data,keys[j])==0) { 
                    break;
                }
            }
            if (j==k) { //如果没有重复,则把数据存入key,并保存结果为No
                strcpy(keys[k++], data[i].data);
                strcpy(data[i].result, "No");
            } else { //否则保存结果为Yes
                strcpy(data[i].result, "Yes");
            }
        }
        for (int i=0; i<N; i++) { //最后打印结果
            printf("%s\n", data[i].result);
        }
        free(keys);
        free(data);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 matlab求解平差
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办
  • ¥15 vue2登录调用后端接口如何实现
  • ¥85 永磁型步进电机PID算法