剑指offer之翻转单词顺序(翻转句子,但组成句子的单词内部有序)

翻转单词顺序

关于思路

在翻转的时候,我们可以这么做,首先把整体进行翻转,例如,要反转I love you 

          第一步:整体翻转成ouy evol I;

          第二步:分别翻转单词内部顺序: you love I

关于代码

#include<stdio.h>
#include<stdlib.h>
void reserveS(char* start,char* end)
{
if (start == NULL || end == NULL)//注意这一步不能省
return;
while (start<end)
{
swap(*start,*end);
start++;
end--;
}
}
char * reserveD(char *s)
{
if (s == NULL)
return NULL;
char *end = s;
char *start = s;
while (*end != '\0')
{
end++;
} //从这出来的时候end已经到斜杠0了;
end--;//指最后一个字符
reserveS(start, end);//函数调完整句翻转了,现在开始翻转各个单词
end = start = s;
while (*start != '\0')
{
if (*start == ' ')
{
start++;
end++;
}
else if (*end == ' ' || *end == '\0')
{
reserveS(start, --end);
start = ++end ;
}
else
{
end++;
}
}
return s;
}


int main()
{
char s[] = "I feel happy now";
reserveD(s);
printf("%s",s);
system("pause");
return 0;

}




关于优化:

while (*end != '\0')
{
end++;

end--;

有一段代码这样写的,为了找到最后一个字符所在的位置,其实这样写会使时间复杂度变高,不太好看,如果用end = start+strlen(s);

这样是不是更好看呢,另外,在交换的时候,书上用了取中间值的办法进行交换,个人认为用swap函数,看起来能让代码短一点,更加好看一些。

关于总结

在实现这个函数的时候,我在句子整体交换的时候出现了问题,在*start = *end的时候崩溃。一直调试没有找到错误,后来看主函数才发现自己给字符串的时候,给了一个指针去指向它,并未分配空间,所以后面再交换赋值的时候出现了问题,这个错误是特别不应该犯得。好了,改了这个错误,认为就没有错误了,然而继续崩溃,再次调试发现,有的地方应该用前置++前置--,而我都用了后置,改了之后,达到预期目标。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值