第一题
第一思路,就是直接用java类StringBuilder,先将他们转化为字符串数组,再各自调用StringBuilder. reverse()方法逆序,最后返回;至于StringBuilder. reverse( ) 的实现原理可以看https://blog.csdn.net/qq_28038487/article/details/101783744,或者在编辑器里ctrl+鼠标单击reverse看一看里面源码也行哈。
不过这个方法在耗时和内存上好像都不是很好。。。
优解:
当然也有更好的Algorithm去解,这里用到上一题的双指针,在这里局部逆序,最后在拼接。
class Solution {
public String reverseWords(String s) {
s = s.concat(" ");
char[] tmp = s.toCharArray();
int start = 0,end = 0;
while(end < tmp.length){
while(tmp[end] != ' '){
end++;
}
reverse(tmp,start,end-1);
start=end+1;
end = start;
}
String ans = new String(tmp);
return ans.substring(0,tmp.length-1);
}
public void reverse(char[] ch,int left,int right){
while(left<right){
char rev = ch[left];
ch[left++] = ch[right];
ch[right--] = rev;
}
}
}
效率是提升了好几倍。
这里发现了有趣的点point:
标注那行是将两行缩写成一行了,但效率却提高了好几个百分点。
在后面链表题的时候,这样做却恰恰相反,倒是觉得奇奇怪怪。
暂时还没想出或找到相关类型的疑惑点的answer;
第二题快慢指针;
这个是official solve-problem;一个很简单的快慢指针的使用,虽然我是没想到(主要之前没用过快慢指针叭),主要还是可以暴力解的原因;