【剑指offer】翻转单词顺序列

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

方法一分析:我们可以先把整个字符串给反转一遍,在从头到尾把每个单词反转一遍,凡是碰到空格就跳过去。题目不难但是我们要看清题目要求,没有说连续的空格只保留一个或开头、末尾不能是空格之类的,否则我们发现代码总是不能通过。

程序:

void Reverse(string& str, int begin, int end){ //反转str的begin和end区间内的字符;
	while (begin < end)
		swap(str[begin++], str[end--]);   
}

string ReverseSentence(string str)
{
	if (str.size()<=1)
		return str;
	Reverse(str, 0, str.size()-1);  //整个字符串取反;
	int begin = 0, end = 0;
	while (end<=str.size())
	{
		if (str[begin] == ' ')  //begin指向单词的第一个字符停止;
		{
			begin++;
			end++;
		}
		else if (str[end] == ' ' ||str[end] == '\0' ) {//end指向单词的最后一个字符的下一个停止;
			Reverse(str, begin, end-1);
			begin = ++end;
		}
		else  end++;
	}
	return str;
}

方法二分析:我们可以从头到尾遍历字符串,碰到空格就插入到结果的最前面,碰到单词就按顺序先保存到一个字符串中,单词完了同样把字符串插入到结果的最前面。

程序:

string ReverseSentence(string str) {
	if (str.size() <= 1) return str;   //字符串为空或只有一个字符,直接返回;
	string s = "";    //保存最终的结果;
	while (!str.empty()){
		string t = "";
		while (!str.empty() && str[0] == ' ') {
			s.insert(s.begin(),' ');   //是空格直接插入到s的最前面;
			str.erase(str.begin());
		}
		while (!str.empty() && str[0] != ' ') {
			t.push_back(str[0]);    //把单词按顺序保存到t中;
			str.erase(str.begin());
		}
		s = t +  s;    //单词插入到s的前面;
	}
	return s;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值