单词的长度

GitHub跳转原题关系图返回列表

整行读入后按空格切分单词,逐个取长度并用逗号连接输出,标点算单词一部分。

OJ: roj

题目 ID: 1142

难度:入门

标签:字符串模拟

创建: 2026-09-29 20:37

更新: 2026-10-05 03:21

题目描述

输入一行单词序列,相邻单词由 1 个或多个空格间隔,单词数 1~300、序列总长不超过 1000。“没有被空格隔开的连续符号串”(含字母、数字、标点)都算一个单词;按输入顺序输出每个单词的长度,逗号分隔。样例输入 She was born in 1990-01-02 and from Beijing city.,样例输出 3,3,4,2,10,3,4,7,5。

思路

整行读入后逐字符扫描,维护"是否在单词内"标志与当前长度:碰到空格即结算一次并清零,连续空格自然被吞;用是否已输出过单词的标志,避免行首或词间多打逗号。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-02 20:15
# update_at: 2026-10-02 20:15

import sys


def solve() -> None:
    # str.split() 不带参数:按任意连续空白切分,天然忽略首尾与词间的多余空格;
    # 切出来的每个片段就是"没有被空格隔开的符号串",也就是题目定义的单词。
    words = sys.stdin.read().split()
    print(','.join(map(str, map(len, words))))


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 03:21
 * update_at: 2026-10-05 03:21
 */
// main.cpp:把"未被空格隔开的连续符号串"看作单词,统计每个单词的长度并逗号输出。
// 思路:整行读入后逐字符扫描。维护"是否正在单词内"标志,遇到空格结束当前单词并输出长度。
//       行首/词间的连续空格都自动跳过;行末若停在单词内,最后再补一次输出。

#include <cstdio>

typedef long long ll;

const int MAXL = 1005; // 输入行总长不超过 1000
char buf[MAXL];

int main() {
    // fgets 整行读入,保留行内空格,遇到换行或 EOF 停止
    if (fgets(buf, sizeof(buf), stdin) == NULL) return 0;

    ll first = 1;        // 标记是否尚未输出过单词,控制逗号不前置
    ll in_word = 0;      // 当前是否处于单词内
    ll cur_len = 0;      // 当前单词已累计的字符数

    for (ll i = 0; buf[i] != '\0'; i++) {
        char c = buf[i];
        if (c == '\n') break; // 行末换行属于读入残留,停止扫描
        if (c == ' ') {
            // 遇到空格:如果正在单词中,先把当前单词长度结算掉
            if (in_word) {
                if (!first) putchar(',');
                printf("%lld", cur_len);
                first = 0;
                in_word = 0;
                cur_len = 0;
            }
            // 连续空格保持 in_word == 0,自动被跳过
        } else {
            // 非空格字符累计到当前单词
            in_word = 1;
            cur_len++;
        }
    }

    // 行末若正好停在单词内部,再补一次输出
    if (in_word) {
        if (!first) putchar(',');
        printf("%lld", cur_len);
    }
    putchar('\n');
    return 0;
}