您的位置:首页 > 职场人生

剑指offer——面试题42:翻转单词序列

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

    分析:这道题题目描述有非常大的问题!!!《剑指offer》书上描述是对的,如果给出 "I am a student. ",注意,最后一个单词后面有个空格,否则,程序怎么改都是通过 0.00%,但是输出结果是相同的,只能说,牛客网坑人啊!

    我的代码:

class Solution {
public:
string ReserveWord(string str1)
{
string word;
string reverseSentence;

for (int i = 0; i < str1.size(); i++)
{
while (str1[i] != ' ' && str1[i] != NULL)  // 必须加一个 != NULL,否则会多输出一个随机值
{
word += str1[i];
cout << i << endl;
cout << word << endl;
i++;
if (str1[i] == ' ')
{
//cout << "跳出来一次" << endl;
break;   // 第一次跳出break,word = .tneduts
}

}
// 处理word ,将其颠倒,然后清空
for (int i = word.size() - 1; i >= 0; --i)
{
reverseSentence += word[i];
}
reverseSentence += ' ';  // 补充一个空格
word.erase();
}
return reverseSentence;
}

string ReverseSentence(string str) {
string tempstr;
string reverse_str;
for(int i = str.size() -1; i >= 0; --i)
{
tempstr += str[i];   // 将整个字符串完全颠倒。如 i am student. ->.tneduts ma i
}
reverse_str = ReserveWord(tempstr);
return reverse_str;
}
};


    如果使用 STL reserve() 函数,更简单了

class Solution {
public:
string ReverseSentence(string str) {
int size = str.size();
reverse(str.begin(), str.end()); // 注意:翻转后的第一个字符是空格
int start = 0;
for(int i = 0; i < size; ++i)
{
if(str[i] == ' ')
{
reverse(str.begin()+start, str.begin()+i);
start = i+1; // 每个单词的第一个下标
}
if(i == size-1)  // 翻转最后一个单词
reverse(str.begin()+start, str.end());
}
return str;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: