/**
* 题目:将字符数组a转换成apple an is this,可以把它叫做字符数组单词逆序
* 要求:1、不能开辟新的数组或者其他内存单元,使其空间复杂度为O(1)
* {空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
* 如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)
* 表示该程序所占用的空间和所用数据量无关}
* 2、不能使用C++特性
*/
#include <stdio.h>
void swap(const char str[], char *head, char *tail);
void main()
{
char str[] = {'t','h','i','s',' ','i','s',' ','a','n',' ','a','p','p','l','e','\0'};
/**
* 思路:先整个字符串做反转操作,然后在对其中的单词做反转操作
*/
char *head = str; // 头指针
char *p = str; // 活动指针
while(*p != '\0')
{
p++; // 指针移到最后,指针只能做移动操作,而不能指哪打哪
}
p--; // '\o'不做反转操作,留着做字符串结束符
char *tail = p; // 尾指针
swap(str, head, tail); // 全部反转
p = str;
while(*p != '\0')
{
if(*p == ' ')
{
tail = p - sizeof(char);
// 将指针指向上一个元素的地址,数组是连续的存储单元,这里直接用地址减去一个char单元大小
swap(str, head, tail); // 反转字符串中的单词
head = p; // 反转后在移动指针
if(*head == ' ')
head++;
}
p++;
}
// 此时p指针已经移动到最后一个元素了
if(*p == '\0') /* 反转最后一个单词 */
{
tail = p - sizeof(char);
swap(str, head, tail); // 反转字符串中的单词
}
printf(str);
printf("\n");
head = NULL; // 防止野指针
p = NULL; // 防止野指针
tail = NULL; // 防止野指针
}
/************************************************************************/
/* 功能:反转字符数组中指定开头和结束位置的字符 */
/************************************************************************/
void swap(const char str[], char *head, char *tail)
{
while(head < tail)
{
char c = *head;
*head = *tail;
*tail = c;
head++;
tail--;
}
}
转载于:https://my.oschina.net/yaoqinwei/blog/162099