牛客网链接
对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
数据范围:字符串长度满足 1≤n≤10000
输入描述:
输入一行,表示用来倒排的句子
输出描述:
输出句子的倒排结果
法一:
- 二维数组每一行是一个单词
- %[a-z]可以看这篇第四个
- 所以遇到一个非字母的字符跳过一次循环,成功读入一个字母 i 才加1
- 倒着打印
#include <stdio.h>
int main()
{
char str[100][21];
int i = 0;
int x = 0;
while (1)
{
x = scanf("%[a-z|A-Z]", str[i]);
if (x) i++;
if (getchar() == '\n') break;
}
while(i>0)
printf("%s ", str[--i]);
return 0;
}
法二:
#include <stdio.h>
#include <string.h>
int main(){
char s[10001];
int len,i;
gets(s);
len=strlen(s);
for(i=len-1;i>=0;i--)
{
if(!(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z'))
{
printf("%s ",&s[i+1]);
s[i]='\0';
}
}
printf("%s",&s[0]);
return 0;
}
法三(双指针):
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
char s[10000];
gets(s);
int len = strlen(s);
int p1 = len - 1, p2 = len;
while(p1 >= 0)
{
while(p1 >= 0 && !isalpha(s[p1]))
p1--;
p2 = p1;
while(p1 >= 0 && isalpha(s[p1]))
p1--;
for(int i = p1 + 1; i <= p2; i++)
printf("%c", s[i]);
printf(" ");
}
return 0;
}
最后会多出空格:
- 第一个元素是字母多出一个空格
- 第一个元素不是字母多出两个空格