这题其实挺坑的,要细致的了解split()这个函数
public String reverseWords(String s) {
if(s== null || s.length() == 0) return s;
String[] str = s.split(" ");
int strLen = str.length;
int i = strLen-1;
StringBuilder sb = new StringBuilder("");
while(i >= 0 ) {
if(!str[i].equals("")){
sb.append(str[i]);
if(i>0) sb.append(" ");
}
i--;
}
return sb.toString().trim();// 第1位存完加了一个" "但是第零位为空就会多一个" "所以要trim()掉
}
public String reverseWords(String s) {
if(s== null || s.length() == 0) return s;
String[] str = s.split(" ");
int strLen = str.length;
int i = strLen-1;
StringBuilder sb = new StringBuilder("");
while(i >= 0 ) {
if(str[i].length()!=0 )
sb.append(str[i]+" ");
//sb.append(" ");
i--;
}
return sb.toString().trim();
}
public String reverseWords(String s) {
if(s== null || s.length() == 0) return s;
String[] str = s.split("\\s+");
int strLen = str.length;
int i = strLen-1;
StringBuilder sb = new StringBuilder("");
while(i >= 0 ) {
sb.append(str[i]);
sb.append(" ");
i--;
}
return sb.toString().trim();
}
以上三种方法等价,说明split()会把" "存成一个""的string。这个方法是O(N)时间,O(1)空间。如果用"\\s+"(正则表达式)来做分隔,那么就不会有" "存成”“的情况了,只有非空格的字符会存进str里。
下面这个是用stack来做,空间也是O(N),所以没有上面的方法好,这是我第一次做leetcode还不知道用split() 这个api的时候写的。越写越好简单清晰就是进步!
public String reverseWords(String s) {
if(s==null||s.length()==0) return s;
s.trim();
//if(s==null||s.length()==0) return s;
String[] str = s.split(" ");
if(str.length==0) return "";
Stack<String> st = new Stack<String>();
int i = 0;
while(i<str.length){
st.push(str[i++].trim());
}
i = 0;
while(i<str.length){
str[i++] = st.pop();
}
StringBuilder ret = new StringBuilder();
i=0;
while(i < str.length){
if(!str[i].equals("")) {
ret.append(str[i]);
if(i != str.length-1) ret.append(" ");
}
i++;
}
//ret.append(str[str.length-1]);
return ret.toString().trim();
}