牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。

题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

/*
思路1:两次翻转
先将字符串整体翻转
再一次翻转每个单词
*/

class Solution {
public:
    string ReverseSentence(string str) {
        int len = str.length();
        string &temp = str;
        reserve(temp,0,len-1);
        int s = -1;
        for(int i=0;i<len;i++){
            if(str[i] == ' '){
                reserve(temp,s+1,i-1);
                s = i;
            }
        }
        reserve(temp,s+1,len-1);
        return str;
    }
    void reserve(string &s,int start,int end){
        char temp;
        while(start < end){
            temp = s[start];
            s[start] = s[end];
            s[end] = temp;
            start++;
            end--;
        }
    }
};

/*
思路2:
利用分割函数将单词切割,并保存在数组里;
然后按照从后往前的数组顺序,依次拼接字符串。
*/

class Solution {
public:
    string ReverseSentence(string str) {
        vector<string> tempv = split(str," ");
        string res;
        for(int i=tempv.size()-1;i>=1;i++){
            res = res + tempv[i] + ' ';
        }
        res = res + tempv[0];
        return res;
    }
    vector<string> split(const string& str, const string& delim) {
	  vector<string> res;
	  if("" == str) return res;
	  //先将要切割的字符串从string类型转换为char*类型
	  char * strs = new char[str.length() + 1] ; //不要忘了
	  strcpy(strs, str.c_str()); 
 
	  char * d = new char[delim.length() + 1];
	  strcpy(d, delim.c_str());
 
	  char *p = strtok(strs, d);
	  while(p) {
		string s = p; //分割得到的字符串转换为string类型
		res.push_back(s); //存入结果数组
		p = strtok(NULL, d);
	 }
 
	 return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_40271182/article/details/84281680