- 题目
- 一、算法思路
- 二、代码实现
题目
输入一个字符串,例: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指向’ ’时,也需要停下,并把end - 1传给函数,最后要把’ ’即end现在指向的位置赋给start指针(而不是end+1),作为字符串结束的标志。
#include#include 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!=' ') { end++; } //循环结束后end指针指向空格 //逆序每个单词.gnijieb->beijing. reverse(start, end - 1); if (*end == ' ') { //跳到下个单词的首元素 start = end+1; } else { //end指向' '的情况 start = end; } } printf("%sn", arr); return 0; }



