CC02:原串翻转

题目

请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。
给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的长度小于等于5000。
测试样例:

"This is nowcoder"
返回:"redocwon si sihT"

解答

题目要求相当于“原地算法”,所以就可以简单的把字符串应该互换的位置直接相互交换就可以实现最后的翻转。代码如下:

class Reverse {
public:
    string reverseString(string iniString) {
        // write code here
        int len=iniString.length();
        int i=0;
        while(i<=len-1-i)
        {
            char temp;
            temp=iniString[i];
            iniString[i]=iniString[len-1-i];
            iniString[len-1-i]=temp;
            i++;
        }
        return iniString;
    }
};

自己之前做了一个类似的题目,但是要求更高一些:将“I am a student”翻转为"student a am I",这里就涉及到了两次翻转,第一次翻转是单词内部的翻转,将student翻转为tenduts;第二次翻转将整句话进行翻转,最后就能实现题目要求的翻转效果。这道题的解法就可以单独将翻转这个函数提取出来,然后将句子中的“ ”空格作为分隔符,实现单词内的翻转,最后再整句话进行翻转。代码如下:

class Solution {
public:
    string ReverseSentence(string str) {
        string result=str;
        int length=result.size();
        if(length==0)
            return "";
        
        result+=' ';
        int mark=0;
        for(int i=0;i<length+1;i++)
        {
            if(result[i]==' ')
            {
                Reverse(result,mark,i-1);
                mark=i+1;
            }
        }
        result=result.substr(0,length);
        Reverse(result,0,length-1);
        return result;
    }
    
private:
    void Reverse(string &str,int begin,int end)
    {
        while(begin<end)
            swap(str[begin++],str[end--]);
    }
};
posted @ 2018-06-29 10:13  MrYun  阅读(179)  评论(0编辑  收藏  举报