leetcode:Reverse Words in a String

Reverse Words in a String

原题连接:https://oj.leetcode.com/problems/reverse-words-in-a-string/
runtimes:9ms

一、实例

        如字符串:“  hello      world ! ”,输出应该为 “!world hello”。

二、分析

        输入一个字符串,将其中的单词反序输出,单词间需要用一个空格隔开;注意:头尾不能有空格,单词间空格只能有一个。
        问题很简单,但是却纠结了我很长时间,原因是因为我以为需要输出,所以每次都把结果输出,结果总是wrong answer,比如数据“  a  b  ”,总会跑出“a b”,但是在自己的编译器上面却是“b a”正确答案。参考了他人的代码后,我发现问题要求其实是将原来字符串参数s赋值为最终结果即可,自己画蛇添足了,需要反省。

三、总结

        1、第一种方案是字符串从后往前扫描,遇到空白字符跳过,遇到字母开始记录,直到遇到空格如此循环直到扫描结束。
         2、第二种方案是利用了string流操作istringstream,需要include  <sstream>头文件,可与java字符中的split操作相比。
        3、第一,需要系统总结一下string的库函数使用;第二,leetcode中自动include <algorithm>函数,其次有些题目是不用输出的,切记。

四、实现

方案一:
class Solution {
public:
    string revers(string &s){
		for (int i = 0, j = s.size() - 1;  i < j; i++, j--)
		{
			char c = s[i];
			s[i] = s[j];
			s[j] = c;
		}
		return s;
	}

    void reverseWords(string &s)
	{
		string result = "";
		for (int i = s.size() - 1; i >= 0;)
		{
			while (i >= 0 && s[i] == ' ') i--;
			if (i < 0) break;
			string str = "";
			while (i >= 0 && s[i] != ' ')
			{
				str += s[i];
				i--;
			}
			result += revers(str) + ' ';
		}
		if (result.size() > 0)
		{
			string::iterator iter = result.end() - 1;
			iter = result.erase(iter);
		}
		s = result;
	}
};


方案二:
#include<vector>
#include<sstream>

class Solution {
public:
    void reverseWords(string &s)
	{
		vector <string> strVec;
		istringstream is(s);
		string rs;
		while (true)
		{
			string str;
			is >> str;
			if (str == "")
				break;
			strVec.push_back(str);
		}
		if (strVec.size() > 0)
		{
			for (int i = strVec.size() - 1; i >= 0; i--)
			{
				rs += strVec[i];
				if (i != 0)
					rs += ' ';
			}
		}
		s = rs;
	}
};



五、对比

       找到了一个14ms的解法,其代码甚妙,首先是对于第7、8行判断的放置,7行避免了在最后多加一个空格,8函则记得在单词后多加一个空格,这样设置减少了最后对字符串的处理;第二他利用了algorithm库函数reverse,感觉这个库挺不错的;第三,对string的操作熟悉,值得学习。
       题目连接:http://blog.csdn.net/kenden23/article/details/20701069

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值