翻转单词顺序列
- 参与人数:2349时间限制:1秒空间限制:32768K
- 算法知识视频讲解
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
// 41.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
using namespace::std;
class Solution {
public:
string ReverseSentence(string str) {
string retStr;
if (str.empty()) return retStr;
int curHead = 0;
int curTail = str.size() - 1;
while (curHead <= curTail) {
char tmp = str[curTail];
str[curTail] = str[curHead];
str[curHead] = tmp;
curHead++;
curTail--;
}
int start = 0;
for (curHead = 0; curHead < str.size(); curHead++) {
if (str[curHead]==' ')
{
int tmpCurHead = curHead;
curHead--;
while (start < curHead) {
char s = str[start];
str[start] = str[curHead];
str[curHead] = s;
start++;
curHead--;
}
start = tmpCurHead + 1;
curHead = tmpCurHead + 1;
}
if (curHead == str.size() - 1){
int tmpCurHead = curHead;
while (start < curHead) {
char s = str[start];
str[start] = str[curHead];
str[curHead] = s;
start++;
curHead--;
}
start = tmpCurHead + 1;
curHead = tmpCurHead + 1;
}
}
return str;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
string test = "student. a am I";
Solution s;
string result = s.ReverseSentence(test);
return 0;
}
第二次做:
没想到第二次做了很久,先上正确的代码:
// 翻转单词顺序列.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <vector>
using namespace::std;
class Solution {
public:
string ReverseSentence(string str) {
string retStr("");
if (str.empty() == true) return retStr;
vector<string> vec;
string tmpStr;
for (int i = 0; i < str.size(); ++i) {
if (str[i] != ' ') {
tmpStr += str[i];
}
if(str[i]==' ') {
vec.push_back(tmpStr);
tmpStr.clear();
}
}
if (tmpStr != "")
vec.push_back(tmpStr);
for (int i = vec.size()-1; i>=0; --i){
retStr += vec[i] + " ";
}
retStr = retStr.substr(0, retStr.size() - 1);
return retStr;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Solution s;
string test = "student. a am I";
string result = s.ReverseSentence(test);
return 0;
}
注意,string.size()返回的长度中不包括 '\0',我在第一个for循环时这样写
for (int i = 0; i <= str.size(); ++i)
i <= str.size(),意味着 i 最后可以走到字符串的 '\0' 位置,然后发生了严重的事。。
拼接字符串时,'\0' 把字符串截断了!!!
导致 retStr 一直等于 I ,而后面的 am a Student. 出不来!
第三次做:
class Solution {
public:
string ReverseSentence(string str) {
string retStr("") ;
if ( str.empty() == true ) return retStr ;
vector<string> vec ;
string strTmp ;
for ( int i = 0; i < str.size(); ++ i ) {
if ( str[i] != ' ' ) {
strTmp += str[i] ;
}
if ( str[i] == ' ' ) {
vec.push_back( strTmp ) ;
strTmp.clear() ;
}
}
if ( strTmp != "" ) vec.push_back( strTmp ) ;
for ( int i = vec.size() - 1; i >= 0; -- i ) {
retStr += vec[i] + " ";
}
retStr = retStr.substr( 0, retStr.size() - 1 );
return retStr ;
}
};