信息学奥赛一本通 1143:最长最短单词 | OpenJudge NOI 1.7 25

【题目链接】

ybt 1143:最长最短单词
OpenJudge NOI 1.7 25:最长最短单词

【题目考点】

1. 字符串处理

【解题思路】

  • 思路1:将字符串分解为多个单词,而后求出各个单词的长度,再找出最长和最短的单词。
  • 思路2:遍历字符串,同时构造单词。遇到空格或逗号时完成构造一个单词,而后判断该单词是否是已知的最长或最短单词,记下最长或最短单词。

【题解代码】

解法1:用字符数组,用二维数组保存多个单词
  • 将字符串拆解为多个单词,用二维数组保存。
  • 遍历该二维数组,找出其中最长和最短单词。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    char s[205][105]; //保存分割后的多个单词,s[i]是第i个单词字符串 
    char c;//当前读取的字符 
    int w = 0, j = 0;//w:s的第一下标,表示单词编号。 j:s的第二下标,表示某单词的第几字符 
    while((c = getchar()) != '\n')//不断读取字符 
    {
        if(c != ' ' && c != ',')//如果不是分隔符,那么向单词s[w]添加一个字符 
            s[w][j++] = c;
        else if(j != 0)//如果是分隔符,且排除有连续空格或逗号的情况 
        {
            s[w][j] = '\0';//为单词s[w]添加字符串末尾 
            w++;//开始填充下一个单词 
            j = 0; 
        }
    }
    s[w][j] = '\0';//为最后一个单词添加末尾 
    w++;
    int wordNum = w;//单词总数量 
    int maxlen = 0, minlen = 200;//maxlen:最长单词长度、 minlen:最短单词长度 
    int max_i, min_i;//max_i:最长单词编号, min_i:最短单词编号 
    for(int i = 0; i < wordNum; ++i)//遍历所有单词,寻找其中最长和最短单词 
    { 
        if(strlen(s[i]) > maxlen)
        {
           max_i = i;
           maxlen = strlen(s[i]);
        }
        if(strlen(s[i]) < minlen)
        {
           min_i = i;
           minlen = strlen(s[i]);
        }
    }
    puts(s[max_i]);//puts输出一个字符串后自动输出换行符 
    puts(s[min_i]);
    return 0;
}
解法2:用string类,遍历字符串,构造单词并看其是否是最长或最短单词
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s, word, maxWord, minWord;//s:输入的字符串 word:分解出的一个单词 maxWord:最长单词 minWord最短单词 
    getline(cin, s);
    s += ' ';//字符串末尾加上一个空格分隔符,便于统一处理 
    int wst = 0, wlen = 0;//wst:单词的起始位置 wlen:单词的长度 
    int minLen = 200, maxLen = 0;//minLen:最短长度 maxLen:最大长度 
    for(int i = 0; i < s.length(); ++i)
    {
        if(s[i] == ' ' || s[i] == ',')//如果遇到分隔符
        {
            if(wlen > 0)//wlen > 0 排除有连续的分隔符的情况
            {
                word = s.substr(wst, wlen);//从wst位置到i-1位置构成一个单词,其长度为wlen,截取该单词 
                if(wlen > maxLen)//如果该单词比最长单词长,那么该单词就是最长单词 
                {
                    maxWord = word;
                    maxLen = wlen;
                }
                if(wlen < minLen)//如果该单词比最短单词短,那么该单词就是最短单词
                {
                    minWord = word;
                    minLen = wlen;
                }
            }
            wst = i + 1;//分隔符的下一个位置作为下一个单词的起始位置 
            wlen = 0;
        }
        else//如果遇到一般字符 
            wlen++;//增加该单词长度 
    }
    cout<<maxWord<<endl;
    cout<<minWord<<endl;
    return 0;
}
  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
信息学奥赛一本通1255:迷宫问题是一个关于迷宫的问题。这个问题要求通过广搜算法来解决迷宫问题,找到走出迷宫的路径。具体来说,迷宫可以看成是由n×n的格点组成,每个格点只有两种状态, "." 和 "#" 。其中 "." 代表可通行的路径,"#" 代表不可通行的墙壁。通过广搜算法,我们可以搜索从起点到终点的路径,找到一条合法的路径即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [信息学奥赛一本通 1255:迷宫问题 | OpenJudge NOI 2.5 7084:迷宫问题](https://blog.csdn.net/lq1990717/article/details/124721407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [c++信息学奥赛一本通1215题解](https://download.csdn.net/download/Asad_Yuen/87357807)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [信息学奥赛一本通(1255:迷宫问题)](https://blog.csdn.net/lvcheng0309/article/details/118879231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值