牛客网HJ31 单词倒排
HJ31 单词倒排
- 描述
- 示例
- 解题思路以及代码
描述
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 1≤n≤10000
输入描述:
输入一行,表示用来倒排的句子
输出描述:
输出句子的倒排结果
示例
示例1
输入:
I am a student
输出:
student a am I
示例2
输入:
$bo*y gi!r#l
输出:
l r gi y bo
解题思路以及代码
整体翻转,然后每个单词在翻转
#include <stdio.h>
#include <string.h>
#include <ctype.h>
//翻转
void AlpReveger(char arr[], int begin, int end)
{
while (begin <= end)
{
char tmp = arr[begin];
arr[begin] = arr[end];
arr[end] = tmp;
++begin;
--end;
}
}
int main() {
char arr[100001] = { 0 };
gets(arr);
int left = 0;
int right = strlen(arr) - 1;
//整体翻转
AlpReveger(arr, left, right);
//每个单词翻转
int k = left;
for (; k <= right; k++)
{
if (arr[k] == ' ' || !isalpha(arr[k]))
{
//不是字母改成空格
if (!isalpha(arr[k]))
{
arr[k] = ' ';
}
//翻转
AlpReveger(arr, left, k - 1);
left = k + 1;
k = left;
}
//控制最后一个翻转
if (k == right)
{
AlpReveger(arr, left, k);
}
}
puts(arr);
}