翻转单词顺序列(知识迁移能力)

题目描述

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

思路

①很简单的一道题,但是如果单词之间有多个空格,或者有前后导0,那么解决起来就很费劲了。我以前是这么认为的,以前貌似做过一个统计单词个数的题,需要判断和标记,非空格遇到空格才算一个单词。

②其实现在想想当时好蠢啊,其实不用那么麻烦,遇到空格就算是一个单词,遇到第二个空格那就是第二个单词,只不过第二个个单词为空而已。

③单词之间的空格会加入n-1个空字符串,有一个是用于正常分割的,单词前会加入相同个数的空字符串,单词后也会加入相同个数的空字符串(但是单词后的空格会用于一个正常分割,所以在结束循环时再加入s,s要是不为空,刚好没有后导0)

_a_ _b_ _ _c_ _     -->(null、a、null、b、null、null、c、null、bull)

代码

#include<stdio.h>
#include<string>
#include<iostream>
#include<vector>
using namespace std;
//c++中的string只能用cin或cout操作
//c++中字符数组可以直接转换string
//c++中string可以通过c_str()转化成字符数组
//c++中string可以通过下标索引(Java中不能)
//c++中string可以直接判断是否相等
//解决多个空格和前后导0问题才是关键(循环结束后,最后一个值不论时什么都要压入)
//可以使用Java中split函数好解决(多个空格之间默认切割出来的是空字符串)
string ReverseSentence(string str) {
    vector<string> v;
    string s="";
    for(int i=0;i<str.length();i++){
        if(str[i]==' '){
            //可以解决前导0和多个空格
            //为什么能解决多个空格连续问题?
            //第一个空格压入前面一个单词,第二个空格压入一个空
            //单词间一个空格刚好,n个空格会压入n-1个空,每个空还原时会跟入一个空格
            v.push_back(s);
            s="";
        }else{
            s+=str[i];
        }
    }
    //不论s为不为空都要压入,不为空则为最后一个单词
    //为空,说明有后导0
    v.push_back(s);
    s="";
    for(int i=v.size()-1;i>=0;i--){
        s+=v[i];
        if(i!=0) s+=" ";
    }
    return "<"+s+">";
}
int main()
{
    char a[]="   student.   a    am   I    ";
    //<    I   am    a   student.   >
    string s=a;
    //printf("%s\n",s.c_str());
    cout<<ReverseSentence(s)<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hqh131360239/article/details/80925760