解题思路:
起初思路是建造一个二维数组;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;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复