7-6 翻转单词顺序 分数 10 全屏浏览题目 切换布局 作者 伍建全 单位 重庆科技学院 给定一个字符串,翻转该字符串,翻转时单词中的字符顺序不变。例如,如果字符串为"Hello World",则翻转后为"World Hello"。单词间以一个或多个空格分隔。注意,字符串开头和结尾都可能有多个空格。输出时去掉多余的空格。只在每个单词之间以1个空格间隔。输出的每行末尾没有空格。 输入格式: 输入可能包括多行。每行代表一个字符串,除了空格外,标点符号和普通字母一样处理。你可以认为一行的字符总数不会超过50000个,单词数不会超过600,每个单词的长度也不会超过30。 输出格式: 输出包括多行,每行对应输入的一行,为翻转后的字符串。输出时去掉多余的空格。只在每个单词之前以1个空格间隔。输出的每行末尾没有空格。 输入样例: 在这里给出一组输入。例如: student. a am I World Hello 输出样例: 在这里给出相应的输出。例如: I am a student. Hello Worldc语言实现
时间: 2024-03-31 12:34:07 浏览: 105
C语言实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 50010
void reverse(char *s, int start, int end) // 翻转字符串 s 的 [start, end] 区间
{
while (start < end)
{
char t = s[start];
s[start] = s[end];
s[end] = t;
start++, end--;
}
}
int main()
{
char line[MAX_LEN];
while (fgets(line, MAX_LEN, stdin)) // 逐行读入字符串
{
int len = strlen(line);
if (line[len - 1] == '\n') line[--len] = '\0'; // 去掉换行符
reverse(line, 0, len - 1); // 翻转整个字符串
int start = 0, end = 0;
while (end < len) // 翻转每个单词
{
if (line[end] == ' ')
{
reverse(line, start, end - 1);
start = end + 1; // 下一个单词的起始位置
}
end++;
}
reverse(line, start, len - 1); // 翻转最后一个单词
// 去掉多余的空格
int i = 0, j = 0;
while (j < len)
{
if (line[j] == ' ')
{
if (i > 0 && line[i - 1] != ' ') printf(" "); // 输出单词间的空格
j++;
}
else
{
line[i++] = line[j++];
}
}
if (i > 0 && line[i - 1] == ' ') i--; // 去掉末尾的空格
line[i] = '\0';
reverse(line, 0, i - 1); // 最后再整个翻转回来
printf("%s\n", line);
}
return 0;
}
```
时间复杂度:$O(nm)$,其中 $n$ 是字符串的总长度,$m$ 是单词的个数。
阅读全文