单词计数 soj1076
BlueEyes' Problem
The Problem
袁源在学英语的时候遇到了一个难题。当他看到一个单词的时候,他不知道这个词他以前是否背过。(这种事也常发生在其他人身上)。为了解决这个问题,他想在读某篇文章之前,先统计这篇文章中每个单词出现的次数。如果是你,你会怎么实现'统计'这个过程呢?
输入
本题只有一组数据.输入为一篇不换行的英语文章(包括各种常用符号,长度小于10000个字母).'单词'在这里定义为只包含52个大小写字母的连续字符串(大写和小写是不同的字母,每个单词的长度不超过100,整个文章总共的单词数不超过1000个,如I'll是两个单词:'I'和'll').符号'@'标志文章的结束.
输出
输出每行包括一个单词本身以及它在文章中出现的次数,中间用一个空格隔开.单词按出现的先后顺序排列.
样例输入
Sometimes I do things I want to do,the rest of time I do things I have to.@
样例输出
Sometimes 1
I 4
do 3
things 2
want 1
to 2
the 1
rest 1
of 1
time 1
have 1
题意很清楚:给出一个字符串,找出其中所有的单词以及该单词出现的次数。一开始想到用map直接去实现,但是到后面发现输出结果的时候顺序不对,因为map是基于红黑树实现的,在进行插入时就是自动按照键值进行自增排序的,因此后来换用结构体实现。
#include<iostream> #include<string> #include<ctype.h> #include<algorithm> usingnamespace std; typedef struct node { string word; int times; }Node; Node t[1010]; int num=0; int Search(string str) //查找该单词是否已经出现过 { int i; for(i=0;i<num;i++) { if(t[i].word==str) return i; } return i; } int main(void) { int i=0,j=0,k; string s; char ch; while((ch=getchar())!='@') { s+=ch; } while(i<s.length()) { string temp; if(isalpha(s[i])) { j=i; while(isalpha(s[j])&&j<s.length()) { temp+=s[j]; j++; } k=Search(temp); if(k==num) //如果该单词没有出现过 { t[num].word=temp; t[num].times=1; num++; } else { t[k].times++; } i=j; } else { i++; } } for(i=0;i<num;i++) { cout<<t[i].word<<""<<t[i].times<<endl; } return0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?