引言
好久都没更新博客了,差点忘了还注册过这个,惭愧啊。。。
近一段时间一直在琢磨底层硬件的开发,似乎好久都没关注C基础知识了,趁着睡前有了兴致 就来看一道经典的编程题吧!题目名称叫做“单词逆序”,相信大家对这道题早已耳熟能详了。不论是在大学期末试题中、部分高校的硕士研究生入学考试上机测试中、甚至是某些公司的笔试中都有出现过。 接下来咱们就来看看这道题吧!
题目描述:
单词倒序 " I am a coder! And you ?" ---> "? you And coder! a am I "
正文
首先我们观察这条字符串发现:题目似乎挺简单的嘛,不就是对字符串的逆序就完事儿了嘛,没啥难度呀。
嗯。。。。如果你真是这么认为的话,只能说你太年轻了 小伙计! 再仔细观察我们发现若是单纯的对字符串逆序的话,那每个单词不就乱套了吗? “you” 会变成 “uoy” 叻~ 所以我们还需要在整个字符串逆序的基础上再对每个单词逆序处理一下就大功告成啦!
那么如何再对单词逆序呢? 细心的你会发现每个单词之间好像有空格存在呢,那是不是以空格为界限 对每个空格之间的单个单词逆序处理一下就行了呢?YES! you are so clever. 不过对单词的逆序可是有一丁点小细节的喔,这里就不详细分析了,相信你能完美解决的啦。 下面我们直接上代码!
#include <stdio.h>
#include <string.h>
void reverse(char *p, char *q)
{
char tmp;
while(p < q)
{
tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}
p = q = NULL;
}
void word_reverse(char *arr, int length)
{
char *p = NULL;
char *q = NULL;
p = arr;
q = arr + length -1;
reverse(p, q); /* 1.这里是将整个字符串逆序 */
p = q = arr;
char *t = NULL;
while(*q != '\0')
{
for(; (*(q+1) != ' ') && (*(q+1) != '\0'); q++) ; /* 这条语句是实现单词逆序的关键 */
t = q + 1; /* t 在这里完美的解决了单词之间多空格的问题,妙! */
reverse(p, q); /* 2.这里是以空格为界 逆序单词 */
q = t;
p = q + 1;
}
p = q = NULL;
}
int main()
{
char arr[] = {" I am a coder! And you ?"};
int len = strlen(arr); /* strlen 求长度不包含'\0' */ /* len = 31 */
int len2 = sizeof(arr)/sizeof(arr[0]); /* len2 = 32 */
printf("%d %d\nBefore reverse :", len, len2);
puts(arr);
word_reverse(arr, len);
printf("After reverse :");
puts(arr);
return 0;
}
运行结果:
结语
今晚以一个简单的C笔试题结束,大家晚安。【月亮】