整行读入后按空格切分单词,逐个取长度并用逗号连接输出,标点算单词一部分。
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;
}