写在前面:这里是小王成长日志,一名在校大学生,想在学习之余将自己的学习笔记分享出来,记录自己的成长轨迹,帮助可能需要的人。欢迎关注与留言。
题目:
题目链接:https://www.dotcpp.com/oj/problem1487.html
题目 1487: [蓝桥杯][算法提高VIP]不同单词个数统计
时间限制: 1Sec 内存限制: 128MB 提交: 1988 解决: 841
题目描述
编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数。例如:对于句子“one little two little three little boys”,总共有5个不同的单词:one, little, two, three, boys。
说明:(1)由于句子当中包含有空格,所以应该用gets函数来输入这个句子;(2)输入的句子当中只包含英文字符和空格,单词之间用一个空格隔开;(3)不用考虑单词的大小写,假设输入的都是小写字符;(4)句子长度不超过100个字符。
输入
输入只有一行,即一个英文句子。
输出
输出只有一行,是一个整数,表示句子中不同单词的个数。
样例输入
one little two little three little boys
样例输出
5
C语言解法
注意:题目没说单词之间是一个空格,事实上,他给的就是两个空格
题目明显分为输入和处理两部分,我们分开来看
接收输入方法1,最简单也最取巧:
char a[50][20];
while (~scanf("%s", a[j++]))
;
//注:单词个数即为j
接收输入方法2,需要注意k=-1和多个空格两个注意点:
char a[50][20], buffer[101] = "\0";
gets(buffer);
// 遍历buffer字符串 取出单词存入数组a中
for (i = 0; i < len; i++, k++)
if (buffer[i] != ' ') //
a[j][k] = buffer[i];
else if (a[j][k + 1] != ' ')//注意可能不止一个空格
{
a[j][k] = '\0';
j++, k = -1; //行数加1 列数归为-1 因为k++会从-1置为0}
}
//注:最后单词个数为j+1
接收输入方法3,方法2的另一种写法
char a[50][20], buffer[101] = "\0";
gets(buffer);
for (i = 0; i < len; i++)
{
if (buffer[i] != ' ')
a[j][k++] = buffer[i];
if (buffer[i] != ' ' && (buffer[i + 1] == ' ' || buffer[i + 1] == '\0'))
{
a[j][k] = '\0';
j++, k = 0; //行数加1 列数归0
}
}
处理部分,寻找句子中不同单词并计数
int new_len = 0, flag;
char arr[j][20];
for (i = 0; i < j; i++)//j是输入的单词个数,可能需要根据前面的写法微调
{
flag = 1; //默认是独特不重复的一个单词
for (k = 0; k < new_len; k++)
if (strcmp(a[i], arr[k]) == 0)
{
flag = 0;//找到一样的单词则置为0
break;
}
if (flag == 1)
strcpy(arr[new_len++], a[i]);
}
printf("%d", new_len);
都看到这里了,各位哥哥姐姐叔叔阿姨给小王点个赞 关个注 留个言吧,和小王一起成长吧,你们的关注是对我最大的支持。
有事没事进来看看吧 : 小王的博客目录索引
C语言专栏看这 : C语言学习专栏
如果以上内容有任何不准确或遗漏之处,或者你有更好的意见,就在下面留个言让我知道吧-我会尽我所能来回答。