题解 | 华为HJ31#单词倒排#
单词倒排
https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836
描述
对字符串中的所有单词进行倒排。
说明:
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> int main(void) { char words[500][21]={0}; short i=0; scanf("%*[^a-zA-Z]"); while(scanf("%20[a-zA-Z]", words[i]) == 1) { i++; scanf("%*[^a-zA-Z]"); } while(i>1) printf("%s ", words[--i]); printf("%s\n", words[--i]); return 0; }
我自己用指针略微改了一下:(就是喜欢用指针,感觉很酷)
#include <stdio.h> //以下是Senky的代码 int main() { int i=0; char words[500][21]={0};//二维数组 char(*p)[21]=words;//指针指向二维数组的第一行 scanf("%*[^a-zA-Z]"); //循环读取20个字符,要求每个字符是大小写字母,若当前读入非空则继续读入 while(~scanf("%20[a-zA-Z]", p[i])) { i++; scanf("%*[^a-zA-Z]"); } while(i) { printf("%s ", p+i-1);//当前的i在数组最后一个字符的下一个字节 i--; } return 0;//2022/09/15 }
图解:
总结:
①这一句代码我觉得是整个程序的灵魂;将我之前学过的
while(scanf("%s", str) != EOF)、while(~scanf("%20s", str) )、scanf("%[a-zA-Z]",str)很好地融合在了一起:
循环读入字符不为空则继续读入+ 控制一次读入字符位数+ 读入特定字符
其中while(scanf("%s", str) != EOF)与while(~scanf("%s", str) )等价;
while(~scanf("%20[a-zA-Z]", p[i]))//循环读取20个字符,要求每个字符是大小写字母,若当前读入非空则继续读入
②这里如果是20不是21的话会报错;
char words[500][21]={0};//二维数组 char(*p)[21]=words;//指针指向二维数组的第一行③用scanf控制特定字符/屏蔽字符的输入;
④后续有空一定要把这段代码再完善下;
⑤当前帖子仅供自我精进、学习使用,有不足之处欢迎指正。
华为-HJ 文章被收录于专栏
机试的题解