剑指offer——翻转单词顺序列
Posted SkyeAngel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer——翻转单词顺序列相关的知识,希望对你有一定的参考价值。
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
解:1、其中有个需要注意的点,就是可能输入的字符串是包含多个空格的" ",这样的话,不能单纯的依靠str.length==1来解决
现在可以借助String的一个方法trim()可以删除字符串的前面和后面的多余空格。这样就不会有上面的问题了。
2、还有一个问题就是String是一个final类,每次进行赋值的时候,都需要重新开辟空间进行拷贝,所以有个改进方法就是,在进行连接字符串的时候,采用大小可变的StringBuffer来进行,到最后才将StringBuffer字符串改为String类型的
3,在进行字符串反转时,要注意,反转的是以空格为划分的,不是直接将所有的字符反转,此时可以用到String类的一个split()方法,对字符串进行分割
public class Solution { public String ReverseSentence(String str) { if(str == null || str.trim().equals("")) return str; String[] strs = str.split(" "); for(int start = 0, end = strs.length - 1; start < end; start++, end--){ swap(strs, start, end); } str = ""; for(int i = 0; i < strs.length - 1; i++){ str = str + strs[i] + " "; } return str + strs[strs.length - 1]; } public void swap(String[] chars, int i, int j){ String temp = chars[i]; chars[i] = chars[j]; chars[j] = temp; } }
另一种方法,不用swap,而是直接在split之后,将数组倒序拼接
public class Solution { public String ReverseSentence(String str) { if(str == null || str.trim().equals("")) return str; String[] strs = str.split(" "); str = ""; for(int i = strs.length - 1; i >= 0; i--){ str += strs[i]; if(i != 0) str += " "; } return str; } }
使用StringBuffer来进行反转,此时StringBuffer中有个append来将字符串进行拼接
public class Solution { public String ReverseSentence(String str) { if(str == null || str.trim().equals("")) return str; String[] strs = str.split(" "); StringBuffer s = new StringBuffer(); for(int i = strs.length - 1; i >= 0; i--){ s.append(strs[i]); if(i != 0){ s.append(" "); } } return s.toString(); } }
以上是关于剑指offer——翻转单词顺序列的主要内容,如果未能解决你的问题,请参考以下文章