双指针实现字符串逆序

来源:互联网 发布:世界手机域名 编辑:程序博客网 时间:2024/06/05 17:48

如题所示的问题,应该在笔试中经常考。于是我就细究了一下。首先逆序,有不同的版本,比如由ab cd ef得到fe dc ba。我遇到的问题是以空格分割各自逆序,即由ab cd ef得到ba dc fe。
首先这个题目我有两种思路:

第一种,简单又直接,使用字符串分割保存在字符数组中,再以数组下标访问方式进行逆序。第二种,就是文章题目所示方法。但是为什么最后选择了这个方法呢。因为这种方法来解决问题,在外层循环只需便利一遍字符串即O(n),那么内层也就是调用的reverse函数的复杂度是o(n/2)。如果不利用指针的做法的话,在时间复杂度上是差不多的,但是需要较多的辅助空间。所以选择了后者。

在解决问题中,也遇到了一些还没弄清楚的问题,希望看到这篇文章的人也可以给我解答。一下是解决成功的代码。

void reverse(char* low,char* high){    if(low==NULL||high==NULL) return;    while(low < high)    {        char temp = *low;        *low = *high;        *high = temp;        low++;        high--;    }}int main(int argc, const char * argv[]) {   // char *p = "I Love You";    char p[1000];    std::cin.getline(p, 1000);    char* begin = p, *end = p;    std::cout<<p<<std::endl;    while(*begin!='\0')    {        if(*begin==' ')        {            (begin)++;            (end)++;        }        else if(*end==' '||*end=='\0')        {            (end)--;            reverse(begin,end);            (end)++;            begin=end;        }        else (end)++;    }    std::cout<<p<<std::endl;    return 0;}

问题就是,在上述代码中,当我把main函数中字符串的输入换成char *p = "I Love You";时,程序会在reverse函数中崩掉并提示内存错误。了解的可以给我回复。

0 0