Leet code 151.反转字符串里的单词
题目描述
给定一句英文,要求倒叙输出每一个单词,并删除单词两边冗余的空格(句子前面和后面没有空格,两个单词之间没有空格)。
注意:不可以使用额外的辅助空间,即原地修改字符串。
思路讲解
- 先去除多余的空格
- 将整个字符串进行反转
- 将每个单词进行反转
代码描述
class Solution {
//1.去除多余的空格
public String removeExtraSpace(String s) {
char[] chars = s.toCharArray();
int fastIndex = 0;
int slowIndex = 0;
int length = chars.length;
while (chars[fastIndex] == ' ') {
fastIndex++;
}
slowIndex = fastIndex;
while (fastIndex < length) {
if ( fastIndex > 0 && chars[fastIndex-1] == chars[fastIndex] && chars[fastIndex] == ' ') {
fastIndex++;
} else {
chars[slowIndex++] = chars[fastIndex++];
}
}
return new String(chars,0,slowIndex);
}
//2.将整个句子进行反转
public String reverseSequence(String s) {
char[] chars = s.toCharArray();
int length = chars.length;
char temp;
for (int i=0; i<length/2; ++i) {
temp = chars[i];
chars[i] = chars[length-i-1];
chars[length-i-1] = temp;
}
return new String(chars,0,length);
}
// 3. 在一个字符区间内进行反转
public String reverseAreaStr(String s,int start ,int end) {
char[] chars = s.toCharArray();
if (chars.length == 1) {
return s;
}
if ( start >= end || start < 0 || end >= chars.length) {
return s;
}
char temp;
// end - start :要反转区间的长度
for (int i = 0; i<=(end-start)/2; ++i) {
temp = chars[start+i];
chars[start+i] = chars[end-i];
chars[end-i] = temp;
}
return new String(chars);
}
public static String reverseWords(String s){
String s1 = removeExtraSpace(s);
String s2 = reverseSequence(s1);
String[] s3 = s2.split(" ");
StringBuffer sb = new StringBuffer();
for (String s4 : s3) {
String s5 = reverseAreaStr(s4, 0, s4.length()-1);
sb.append(s5);
sb.append(" ");
}
return sb.toString().trim();
}
}
总结
这道算法题主要学习了解题的思路,还是学习去除多余的空格算法,这个功能是从移除相同数字的算法演变而来。

浙公网安备 33010602011771号