解题思路:


起初思路是建造一个二维数组;char a [] [];用于存放字符串,不过当时不知道怎么退出while(gets(str[i]))循环

题解中Wu师兄给出结构体,突然发现可以用结构体数组代替二维数组;

(退出循环再回车后 ctrl+z 回车 就可以了)

所以就用结构体的方法解答本题

 

我想拉一下算法,

1.首先容易想到的思路就是先把单词全部输入,存入结构体数组中,


2.然后进行比较(循环中);(长度与内容的区别):不过后来用strcmp函数后感觉这个很直接就可以区分单词;不需要分支判断长度与内容;


3.如果遇到相同的单词直接赋值为0就好啦(本来想法二维数组赋值成0,遇见continue就ok),不过这里结构体中的flag=0;可以发挥同样的作用!(如果把相同的删除,要涉及顺序表(如数组)的前移问题,增加算法的时间复杂度,耗时,所以整体赋值为0,用0当做标记!来标记相同的单词或者理解为重复被删除的单词);


4.最后输出不为0的结果ok喽!





注意事项:


看我的注释吧!

参考代码:


#include<stdio.h>
#include<string.h>
struct T
{
    int flag;
    char str[50];
};

int main()
{
    int n,i=0,j,sum=0;
    char str[50];
    struct T a[105];
   while(scanf("%s",str)!=EOF)         //gets 输入还要区分空格,不如用scanf与空格结束们这个单词的输入
   {                                                    // ctrl + z +回车 结束循环


       //a[i++].str[105]=str[50];              //只是单个字符不是字符串........
       strcpy(a[i].str,str);                       //c 语言没有字符串直接复制,所以用strcpy函数复制
       a[i].flag=1;                                  //所有flag初值为1 用于标记
       //puts(a[i].str);
       i++;
   }
   n=i;
   //printf("%d",n);
   for(i=0;i<n;i++)
   {
       for(j=i+1;j<n;j++)
       {
           if(strcmp(a[i].str,a[j].str)==0)                //用于比较,相等则为0
           {
               a[j].flag=0;
               // printf("**@@@@@@@@@@@@@@@**\n");
           }
       }
   }
   for(i=0;i<n;i++)
    {
        if(a[i].flag==1)
        {
            sum+=1;
           // puts(a[i].str);
        }
     }
    // printf("****\n");
     printf("%d",sum);
     //printf("\n****\n");
    return 0;
}


点赞(5)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论