50字范文,内容丰富有趣,生活中的好帮手!
50字范文 > 信息学奥赛一本通 1149:最长单词2 | OpenJudge NOI 1.13 16

信息学奥赛一本通 1149:最长单词2 | OpenJudge NOI 1.13 16

时间:2023-07-02 15:54:52

相关推荐

信息学奥赛一本通 1149:最长单词2 | OpenJudge NOI 1.13 16

【题目链接】

ybt 1149:最长单词2

OpenJudge NOI 1.13 16:最长单词2

【题目考点】

1. 字符串遍历

2. 处理多个字符串

3. while(cin >> …)读入字符串

适合于读入多个由空格分开的字符串

string s;while(cin >> s){//...}

调试时,输入Ctrl+z,按回车,即可结束输入,观察输出。

【题解代码】

解法1:遍历字符串

用一个字符数组保存当前查看的单词、最长单词,用变量保存最长单词长度。

#include<bits/stdc++.h>using namespace std;int main(){char s[505], word[505], mxWord[505];//s:完整字符串 word:当前查看的单词 mxWord:最长单词 cin.get(s, 505);int ct = 0, ctMax = 0, wi = 0, len;//ct:单词中字母计数 ctMax:最大单词长度 word_sp:最长单词开始的位置 len = strlen(s);for(int i = 0; i < len; ++i){if(s[i] == ' ' || s[i] == '.'){word[wi] = '\0';//单词末尾加'\0',构成字符串 wi = 0;//wi还原,等待下次向word字符数组赋值 if(ct > ctMax)//如果该单词长度比已知最长的单词长度更长 {ctMax = ct;//ctMax记录最长单词长度 strcpy(mxWord, word);//mxWord保存最长的单词 }ct = 0;}else{ct++;//单词长度计数 word[wi++] = s[i];//将当前查看的字符s[i]填入word字符串中 }}cout<<mxWord;return 0;}

解法2:将该句子分解为多个单词,然后找各单词中的最长单词。

分解出的多个单词可以保存在二维字符数组或string类数组中。该解法用string类数组。

#include<bits/stdc++.h>using namespace std;int main(){string s, word[505];getline(cin, s);//输入带空格的字符串int ws, wi = 0, mxi = 0;//ws:单词首字母下标 , wi:word数组下标, mxi:最长单词下标 for(int i = 0; i < s.length(); ++i)//遍历字符串{if(s[i] == ' ' || s[i] == '.')//当i位置是空格{word[wi++] = s.substr(ws, i - ws);//从ws位置开始,截取i-ws长度,即为一个单词ws = i + 1;//截取后,下个单词首字母位置为i + 1}} for(int i = 0; i < wi; ++i)//求最长单词{if(word[i].length() > word[mxi].length())mxi = i;}cout<<word[mxi];return 0;}

解法3:使用while(cin >>…)

适合于读入多个用空格分开的字符串

#include<bits/stdc++.h>using namespace std;int main(){string s, s_mx;while(cin >> s){if(s[s.length()-1] == '.')//如果末尾是句号'.' s.pop_back();//删去末尾字符if(s.length() > s_mx.length())s_mx = s;}cout << s_mx;return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。