PTA刷题Basic篇——1009.说反话——Day(5)

在这里插入图片描述、我们需要将一句话倒置,不是将所有字母全部倒置,而是将后面的单词放在前面,前面的单词放在后面。

题目分析

方法一
我们可以选择一个vector容器,和一个tmp字符串。我们不断读入字符,如果字符是回车就结束,如果字符不是一个空格,则加入到tmp字符串中。如果遇到了空格,就把tmp放入vector中,最后将tmp置为空。
由于最后一个单词没有空格,所以我们还有单独把最后一段加入的vector中。最后将vector从后往前依次输出即可。
方法二
我们可以使用方向迭代器。反向迭代器是vector的一种迭代器。它可以让我们从后往前遍历vector容器,然后将单词倒序输出。在这里面我们还用到了c_str函数,函数c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址。详情见代码

方法一代码

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
    vector<string>v;
    string str;
    string temp="";
    getline(cin,str);
    for(int i=0;i<str.length();i++){//以空格分割字符串放入动态数组v中
        if(str[i]=='\n')
            break;
        if(str[i]!=' ')
            temp+=str[i];
        else
        {
            v.push_back(temp);
            temp="";
        }
    }
    v.push_back(temp);//最后一个单词没有space所以在这里要加入动态数组中,否则会少一个单词
    for(int i=v.size()-1;i>=0;i--){
        if(i!=0)
            cout<<v[i]<<" ";
        else
            cout<<v[i]<<endl;
    }
    return 0;
}

方法二代码

#include<vector>
#include <string>
#include <iostream>
using namespace std;
int main(){    
	string s;    
	vector<string>v;    
	while(cin>>s)        
		v.push_back(s);    
	for(auto it=v.rbegin();it!=v.rend();++it)
		printf("%s%s",it==v.rbegin()?"":" ",it->c_str()); 
	return 0;
}

我们先判断迭代器所指位置是不是头部,如果不是就输出空串"",如果是就输出" “代表下一个单词,c_str是这个迭代器所指字符串的首地址。
由于一开始it指向了Come的e,而且it==v.rbegin(),所以我们输出空串,即”"。it->c_str是e的字符串首地址,所以应该输出Come,以此类推。

总结

答题用时20min
Q9——finish√

发布了60 篇原创文章 · 获赞 2 · 访问量 1045

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105469665