前言:在C/C++的学习过程当中一定一定要多刷题,牛客网作为国内内容超级丰富的IT题库,尤其是它的C、C++,有从入门到大厂真题,而且大部分的考试题目也是从中抽取,还有很多面经,推荐大家去牛客网进行刷题练习,点击链接:牛客网刷题入口
题目
输入一个字符串,例:I like beijing.
输出结果:beijing. like I
一、算法思路
1.暴力求解法:准备一个新数组,从后往前遍历,找到空格后,将单词放在新数组中,然后依次寻找,不建议采用;
2.正确的算法思想:
(1)先将字符串全部逆序
.gnijieb ekil I
(2)再逆序每个单词
beijing. like I
1.我们需要准备一个逆序字符串的函数,用来逆序所有字符串和每个单词字符串,准备两个函数参数接收字符串的首元素地址和最后一个元素的地址。然后利用逆序字符串的算法进行逆序,利用left和right两个指针,满足left < right这个条件。
2.主函数中需要准备一个起点指针指向字符串首元素地址,还需要创建一个辅助指针end指向最后一个元素的地址,当end指针指向空格的时候就停下,然后将end - 1指向的最后一个元素的地址传给函数,逆序完后,把end + 1的字符赋给start,作为未逆序的单词的首元素地址,后面的同理;而当end指向’\0’时,也需要停下,并把end - 1传给函数,最后要把’\0’即end现在指向的位置赋给start指针(而不是end+1),作为字符串结束的标志。
二、代码实现
#include<stdio.h>
#include<string.h>
void reverse(char* left, char* right)
{
//1.逆序所有字符
//2.逆序每个单词.gnijieb->beijing.
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[20] = { 0 };
gets(arr);//I like beijing.
int len = strlen(arr);
//1.把全部字符串逆序
//传字符串的首地址,和最后一个元素的地址
reverse(arr, arr + len - 1);
//2.再逆序每个单词
//也是传每个字符串的首元素地址和最后一个元素的地址
//需要辅助指针,指向最后一个元素的地址
char* start = arr;
while (*start)
{
char* end = start;
while (*end != ' '&&*end!='\0')
{
end++;
}
//循环结束后end指针指向空格
//逆序每个单词.gnijieb->beijing.
reverse(start, end - 1);
if (*end == ' ')
{
//跳到下个单词的首元素
start = end+1;
}
else
{
//end指向'\0'的情况
start = end;
}
}
printf("%s\n", arr);
return 0;
}