news 2026/10/5 8:28:17

洛谷C语言题解:P1308 统计单词数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
洛谷C语言题解:P1308 统计单词数

P1308 [NOIP 2011 普及组] 统计单词数


题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。

输入格式

共222行。

第111行为一个字符串,其中只含字母,表示给定单词;

第222行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从000开始);如果单词在文章中没有出现,则直接输出一个整数−1-1−1。

注意:空格占一个字母位。

输入输出样例 #1

输入 #1

To to be or not to be is a question

输出 #1

2 0

输入输出样例 #2

输入 #2

to Did the Ottoman Empire lose its power at that time

输出 #2

-1

说明/提示

数据范围

1≤1\leq1≤第一行单词长度≤10\leq10≤10。

1≤1\leq1≤文章长度≤106\leq10^6≤106。

noip2011 普及组第 2 题

解题思路

题目要求输入了一个目标词和一段句子或文章后,输出两个整数,一个代表目标词出现了多少次(不论大小写),另一个代表目标词第一次出现时是在哪里。如果目标词并没有出现过,则只输出一个“-1”。

为了完成题目要求,我们需要实现这些功能:

输入目标词和句子(或文章)

  • 注意消除目标词和句子末尾的换行符
  • 注意输入句子时需要连空格一起读取

寻找句子的目标词

  • 要将目标词和句子统一转换成小写(题目要求不论大小写,那就统一小写吧)
  • 注意使用 ASCII 码时不要把标点符号也转换了
  • 用空格来区分一个个词语。
  • 注意要跳过空格,空格不能算在一个单词内。

输出结果

  • 根据不同情况输出不同结果

解

C语言解:

#include<stdio.h>//目标单词(最长10,开15以防万一)charword[15];//句子、文章(最长可能有10的6次方,写大一点防止越界)charsent[1000005];intmain(){//读入第一行的目标单词scanf("%s",word);//吃掉 scanf 留下的换行符,否则会被下面的 fgets 读到getchar();//用 fgets 读入第二行的整篇文章,fgets 可以把空格读进去fgets(sent,sizeof(sent),stdin);//手动计算文章长度(数到 '\0' 为止)intsentlen=0;while(sent[sentlen]!='\0'){sentlen++;}//手动计算目标词长度intwordlen=0;while(word[wordlen]!='\0'){wordlen++;}//去掉文章末尾的换行符,并让长度减1if(sentlen>0&&sent[sentlen-1]=='\n'){sent[sentlen-1]='\0';sentlen--;}//将目标单词统一转成小写(只处理大写字母,避免动到其他字符)for(inti=0;i<wordlen;i++){if('A'<=word[i]&&word[i]<='Z'){word[i]+=32;}}//将文章也统一转成小写,方便后面忽略大小写比较for(inti=0;i<sentlen;i++){if('A'<=sent[i]&&sent[i]<='Z'){sent[i]+=32;}}//count 记录出现次数,firstPos 记录第一次出现的位置(-1表示还没找到)intcount=0;intfirstPos=-1;//开始遍历文章,按下标 i 逐个处理inti=0;while(i<sentlen){//跳过连续空格,空格不属于任何单词while(i<sentlen&&sent[i]==' '){i++;}//如果跳完空格已经到文章末尾,说明没有更多单词了,跳出循环if(i>=sentlen){break;}//记录当前单词的起始位置(也就是题目要的“位置”)intstart=i;//往后找到单词结束(遇到空格或文章末尾)while(i<sentlen&&sent[i]!=' '){i++;}intend=i;//计算当前单词的长度intlenCur=end-start;//只有长度和目标单词相同,才可能匹配if(lenCur==wordlen){intmatch=1;//逐个字符比较(两边都已转小写)for(intj=0;j<wordlen;j++){if(sent[start+j]!=word[j]){match=0;break;}}//如果完全匹配,统计次数并记录第一次出现的位置if(match){count++;if(firstPos==-1){firstPos=start;}}}}//如果一次都没匹配到,输出-1//顺便直接 return 结束程序if(firstPos==-1){printf("-1\n");return0;}//否则输出出现次数和第一次出现的位置printf("%d %d\n",count,firstPos);return0;}

另,附上 Java 解:

importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassMain{publicstaticvoidmain(String[]args){BufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(System.in));Stringword;Stringsentence;try{word=bufferedReader.readLine().toLowerCase();sentence=bufferedReader.readLine().toLowerCase();}catch(IOExceptione){thrownewRuntimeException(e);}intcount=0;intfirstPos=-1;intwordLen=word.length();intsentLen=sentence.length();inti=0;while(i<sentLen){while(i<sentLen&&sentence.charAt(i)==' '){i++;}if(i>=sentLen)break;intstart=i;while(i<sentLen&&sentence.charAt(i)!=' '){i++;}intend=i;if(end-start==wordLen){booleanmatch=true;for(intj=0;j<wordLen;j++){if(word.charAt(j)!=sentence.charAt(start+j)){match=false;break;}}if(match){count++;if(firstPos==-1){firstPos=start;}}}}if(firstPos==-1){System.out.println("-1");return;}System.out.println(count+" "+firstPos);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 8:28:03

大数据驱动的B站数据分析与可视化系统实战

1. 项目概述与核心价值1.1 这个毕设到底在做什么先聊点实在的。B站数据分析可视化系统&#xff0c;这几个词拆开看都不陌生&#xff0c;但真正把它做成一个能跑、能答辩、能拿得出手的毕设项目&#xff0c;其实有不少门道在里面。一句话说清楚这个系统的定位&#xff1a;它是一…

作者头像 李华
网站建设 2026/10/5 8:28:00

PyTorch入门必看:MNIST数据集自动下载与本地读取全攻略

新手学PyTorch第一个卡壳的地方&#xff0c;往往不是模型怎么写&#xff0c;而是数据集怎么弄到手。MNIST作为最经典的入门数据集&#xff0c;很多人第一次跑教程就挂在数据加载这一步&#xff1a;torchvision下载半天报404、网络超时、文件损坏&#xff0c;心态直接裂开。其实…

作者头像 李华
网站建设 2026/10/5 8:26:52

SSH免密登录与配置文件实战:密钥认证+一行命令登录服务器

你有没有过这种经历&#xff1a;新配置的一台服务器&#xff0c;登录命令长得快要专门存个便签——ssh root123.456.78.90 -p 22022&#xff0c;每次还得盯着屏幕敲密码、等指纹确认、再敲一次密码。一天下来反复登录三五台机器&#xff0c;光是机械操作就能耗掉十几分钟&#…

作者头像 李华
网站建设 2026/10/5 8:25:57

P2G与碳捕集热电联供系统双目标优化及epsilon约束算法Matlab复现

1. 复现背景与核心价值拆解先说结论&#xff1a;这篇论文的复现难度在同类综合能源系统优化文章里算中上&#xff0c;但它值得做。为什么&#xff1f;因为它把两个容易被人忽略的约束同时摆上了桌——碳排放成本和运维成本&#xff0c;而且用的是求解双目标问题的epsilon约束算…

作者头像 李华
网站建设 2026/10/5 8:25:50

Seurat单细胞分析四层逻辑:从原始数据到生物学解读

1. 这不是“学个包”那么简单&#xff1a;为什么单细胞分析必须从Seurat起步如果你刚接触生信&#xff0c;大概率被“单细胞测序火了”“10X Genomics发高分文章”这类信息轰炸过。但真正打开Rstudio敲下library(Seurat)时&#xff0c;很多人卡在第一步——不是代码报错&#x…

作者头像 李华
网站建设 2026/10/5 8:25:19

COMSOL激光通孔仿真:变形几何与蒸发边界建模详解

做激光仿真通孔的项目时&#xff0c;我最常被问的问题是&#xff1a;“这孔到底能不能打穿&#xff1f;得多大功率、多长脉宽&#xff1f;”实话讲&#xff0c;拍脑袋给答案心里没底&#xff0c;但只要在 COMSOL 里搭一个能跟随材料蒸发的动边界模型&#xff0c;很多工艺问题都…

作者头像 李华