文章

【GESP】C++三级练习 luogu-B2120 单词的长度

GESP三级练习,字符串练习(C++三级大纲中6号知识点,字符串),难度★★☆☆☆。

luogu-B2120 单词的长度

题目要求

题目描述

输入一行单词序列,相邻单词之间由 $1$ 个或多个空格间隔,请对应地计算各个单词的长度。

注意:如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。

输入格式

一行单词序列,最少 $1$ 个单词,最多 $300$ 个单词,单词之间用至少 $1$ 个空格间隔。单词序列总长度不超过 $1000$。

输出格式

依次输出对应单词的长度,之间以逗号间隔。

输入输出样例 #1

输入 #1

1
She was born in 1990-01-02  and  from Beijing city.

输出 #1

1
3,3,4,2,10,3,4,7,5

题目分析

解题思路

  1. 首先读取一整行输入的字符串,包含单词和空格
  2. 遍历字符串的每个字符:
    • 遇到非空格字符时,累加当前单词长度
    • 遇到空格字符时,如果前面有单词(长度不为0),则输出该单词长度
  3. 最后需要输出最后一个单词的长度
  4. 注意输出格式:用逗号分隔每个长度,第一个数字前不加逗号

复杂度分析:

  • 时间复杂度为 $O(n)$,其中n为输入字符串的总长度
  • 空间复杂度为 $O(1)$,只需要几个变量来记录状态


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <string>

int main() {
    // 定义字符串变量用于存储输入的单词序列
    std::string str;
    // 使用getline读取一整行输入,包含空格
    std::getline(std::cin, str);
    // 获取字符串长度
    int length = str.length();
    // flag用于标记是否是第一个输出的数字
    bool flag = true;
    // count用于统计当前单词的长度
    int count = 0;
    // 遍历字符串的每个字符
    for (int i = 0; i < length; i++) {
        // 如果当前字符是空格
        if (str[i] == ' ') {
            // 如果count为0说明是连续空格,直接跳过
            if (count == 0) {
                continue;
            } else {
                // 如果是第一个数字,直接输出
                if (flag) {
                    std::cout << count;
                    flag = false;
                } else {
                    // 如果不是第一个数字,需要先输出逗号
                    std::cout << "," << count;
                }
                // 重置单词长度计数器
                count = 0;
            }

        } else {
            // 如果不是空格,单词长度加1
            count++;
        }
    }
    // 输出最后一个单词的长度
    std::cout << "," << count;
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权