您的位置:首页 > 其它

557. Reverse Words in a String III

2017-12-15 16:53 363 查看
问题描述:将一句话中每个字的字符串倒序排列。

思路:正向遍历,声明一个StringBuffer,遇上空格就append。遇上非空格时,如果是空格后第一个字符继续append,如果不是那么就insert到当前位置。

public String reverseWords(String s) {
char[] charArray=s.toCharArray();
StringBuffer sb=new StringBuffer();
int insertInex=0;
boolean word=false;
for(int i=0;i<charArray.length;i++){
char c=charArray[i];
if(Character.isWhitespace(c)){
word=true;
insertInex=i;
sb.append(charArray[i]);
}else{
if(word){
insertInex=insertInex+1;
sb.append(charArray[i]);
word=false;
}
else
sb.insert(insertInex, c);
}
}
return sb.toString();
}


最佳答案:

public String reverseWords(String s) {
if (s == null || s.length() == 0) {
return "";
}

char[] chars = s.toCharArray();
int i = 0;
while (i < chars.length) {
int index = s.indexOf(' ', i);
if (index == -1) {
reverse(chars, i, chars.length - 1);
break;
}
reverse(chars, i, index - 1);
i = index + 1;
}

return new String(chars);
}

private void reverse(char[] chars, int start, int end) {
while (start < end) {
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
}


差距分析:

出现运行时间极大差距的地方是每个字的重新排序。原思路中是通过StringBuffer实现的,append每次都会先检查下最大长度有没有超,如果超了就扩容。然而这些检查其实是完全没有必要的,而insert方法不仅检查了长度,使用的是System.arraycopy复制了一遍。最佳答案则是直接进行转换得到新的数组。效率自然快得多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: