信息学奥赛一本通 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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值