代码改变世界

面试题4:单词翻转

2016-03-21 20:43  Keiven_LY  阅读(389)  评论(0编辑  收藏  举报

题目描述

编写一个函数将字符串“I am from Beijing”,翻转成“Beijing from am I”,即将字符串中各个单词的位置倒置,但不改变各个单词本身。

方法一:先翻转单词,再整体翻转

char *ReverseWorldInString_1(char *str)  
{
    char *start = str;
    char *end = str;
    char *ptr = str;

    while(*ptr++!='\0') //遍历整个字符串,将单词翻转
    {
        if(*ptr==' '||*ptr=='\0')  //以空字符或结束符作为单词的标记,这里*ptr==' '的空格符中间要有空格,不能连着,即''这样,因为这样不识别
        {
            end=ptr-1;//指向单词的最后一个字符
            while(start<end)
                swap(*start++,*end--);  //将单词倒置

            start=end=ptr+1;  //指向下一个单词
        }
    }

    start=str; //start指向整个字符串的开头
    end=ptr-2; //end指向整个字符串的末尾

    while(start<end)   
        swap(*start++,*end--);    //遍历字符串整个进行翻转

    return str;
}

方法二:先整体翻转,再翻转单词

char *ReverseWorldInString_2(char *str)  
{
    char *start=str;
    char *end=str;
    char *ptr=str;
     char *p=str;

    while(*ptr++!='\0')  //遍历整个字符串,将单词翻转
        end=ptr-1;  //找到字符串的末尾
    while(start<end)
        swap(*start++,*end--);  //倒置整个字符串

    start=str; //start指向整个字符串的开头
    end=ptr-1; //end指向整个字符串的末尾
    while(*p++!='\0')  //遍历整个字符串,将单词翻转
    {
        if(*p==' '||*p=='\0')  //以空字符或结束符作为单词的标记,这里*ptr==' '的空格符中间要有空格,不能连着,即''这样,因为这样不识别
        {
            end=p-1;  //指向单词的最后一个字符
            while(start<end)
                swap(*start++,*end--);   //将单词倒置

            start=end=p+1;  //指向下一个单词
        }
    }    
    return str;
}

测试程序:

int main()
{
    char strSrc_1[]="I am from Beijing";
    cout<<"原字符串是:"<<strSrc_1<<endl;

    ReverseWorldInString_1(strSrc_1);
    cout<<"反转后字符串为:"<<strSrc_1<<endl;
    
     char strSrc_2[]="Shang Hai is a big city";
    cout<<"原字符串是:"<<strSrc_2<<endl;

    ReverseWorldInString_2(strSrc_2);
    cout<<"反转后字符串为:"<<strSrc_2<<endl;

    system("pause");
    return 0;
}

注意

程序中while(*ptr++!='\0')  //遍历整个字符串,将单词翻转
                   end=ptr-2;  //找到字符串的末尾

为什么end=ptr-2?原因是,字符串在内存中的存储如下:

                                            

指针ptr开始指向字符串的首地址,即图示1所指位置,while循环后,ptr逐加,当*ptr='\n'时,实际ptr是处于图示6所指位置,后还要++,及while结束后,ptr指向图示7所指位置,而要使指针指向字符串的末尾,即图示5所指位置,就要让end=ptr-2