题解 | 华为HJ31#单词倒排#

单词倒排

https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836

描述

对字符串中的所有单词进行倒排。

说明:

1、构成单词的字符只有26个大写或小写英文字母;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;

数据范围:字符串长度满足 1n10000 

输入描述:

输入一行,表示用来倒排的句子

输出描述:

输出句子的倒排结果

示例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 文章被收录于专栏

机试的题解

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-29 08:32
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务