Mark
String[] str = s.split(" ");
直接分割成字符串数组。-
字符串可变语言: C/C++, Ruby, PHP, Swift 字符串不可变语言: Java, Python, C#, Javascript, Go Java可以利用String与StringBuffer之间的转换做到类似可变效果。
- 在判断条件里应该避免出现循环中的变量。逻辑上可能没问题,在循环中发生变化,会导致意外的情况出现。提前将其算出常量,赋值,作为判断边缘。
题目
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
提示:
~~~~
1 <= s.length <= 5 * 104
~~~~
s 包含可打印的 ASCII 字符。
~~~~
s 不包含任何开头或结尾空格。
~~~~
s 里 至少 有一个词。
~~~~
s 中的所有单词都用一个空格隔开。
输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
输入: s = “God Ding”
输出:“doG gniD”
使用JavaBuffer类的reverse()方法很容易就搞定了,但是有点耍赖的意思:
class Solution {
public String reverseWords(String s) {
String[] str = s.split(" ");
String result = "";
for(int i=0; i<str.length; i++){
String re = new StringBuffer(str[i]).reverse().toString();
result = result.concat(re).concat(" ");
}
return result.trim();
}
}
按照题解所说用额外空间方法完成。
class Solution {
public String reverseWords(String s) {
int i = 0, start = 0, finish = 0;
char[] result = new char[s.length()];
//
for(i = 0; i < s.length(); i++){
if(s.charAt(i) != ' '){//找到空格
continue;
}
finish = i-1;
while(start < i){
result[start++] = s.charAt(finish--);
}
result[i] = ' ';
start = i+1;
}
//末尾一个单词的转换
finish = i-1;
while(start < i){
result[start++] = s.charAt(finish--);
}
return String.valueOf(result);
}
}
卡在这里好半天,只有前几个字符转换进去了,调试半天发现循环次数不够。循环里start
是变化的,导致循环次数不正确,循环提前结束,部分位置是\u0000。判断条件应该为常量,一旦有循环中出现的变量,看来很危险的。
(没有会员没有调试功能只能用这种土办法搞了(#^. ^ #)见笑了)
官方题解的方法二是原地解法,空间复杂度调整为了O(1)。Java的字符串不能改变, 所以实现不了。