151.翻转字符串里的单词
这个代码有3个步骤需要去做
第一步:去除多余的空格:
这个内部的单词进行去多余空格处理,然后再调用反转的方法,
注意这个里面用while循环,才不会多自增,若是用if,会跳过完整单词的部分
class Solution {
public:
string reverseWords(string s) {
// 定义一个快指针,定义一个慢指针
int fastIndex = 0, slowIndex = 0;
while (s.size() > 0 && fastIndex < s.size() && s[fastIndex] == ' ') {
fastIndex++;
}
for (; fastIndex < s.size(); fastIndex++) {
if (fastIndex - 1 > 0 && s[fastIndex - 1] == s[fastIndex] &&
s[fastIndex] == ' ') {
continue;
} else {
s[slowIndex++] = s[fastIndex];
}
if (slowIndex - 1 > 0 && s[slowIndex - 1] == ' ') {
s.resize(slowIndex - 1);
} else {
s.resize(slowIndex);
}
}
return s;
}
};
第二步:反转整个字符串
void reverse(string& s, int start, int end) { // 翻转,区间写法:左闭右闭 []
while (start < end) {
swap(s[start], s[end]);
start++;
end--;
}
}
第三步:反转每个单词
总体代码如下
class Solution {
public:
// part 1 对全部的字符串进行整体的去除空格,只保留有效的单词间的空格
void removeExtraSpace(string& s) {
int fast = 0, slow = 0;
for (
; fast < s.size();
fast++) { //++
// 是有意为之,目的是跳过while循环后的那个空格,开始处理下一个单词。如果是多个空格,下一行代码进行处理
if (s[fast] !=' ') { // 目的是为了不让第一个单词的前面有空格,以及后续单词前面出现多个空格的问题处理
if (slow !=
0) { // 不是第一个单词,那么后续的都需要给新字符串留出单词间隔的空隔
s[slow++] =' ';
}
while (fast < s.size() && s[fast] !=' ') { // 进行整个单词的处理
s[slow] = s[fast];
fast++; // while 循环的自增:while
// 循环在遇到非空格字符时,将所有连续的非空格字符复制到
// slow 指针位置,并将 fast 指针移动到下一个空格位置
slow++;
}
}
}
s.resize(slow);
}
void reverseString(string& s, int start, int end) {
while (start < end) {
swap(s[start], s[end]);
start++;
end--;
}
}
string reverseWords(string s) {
removeExtraSpace(s);
reverseString(s, 0, s.size() - 1);
int start = 0;
for (int i = 0; i <= s.size(); i++) {
if (i == s.size() ||
s[i] ==' ') { // 说明到了整个字符串的末尾或者是到了某个单词的末尾,可以进行整体的反转了
reverseString(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
java代码如下:
class Solution {
public String reverseWords(String s) {
// 调用一个函数,该函数可以做到把整个s进行去空格处理, 考虑用StringBuilder ,变成可变化的序列字符串 对象sb
StringBuilder sb = removeExtraSpace(s);
// 使用 setCharAt 和temp的方式,把整个sb字符从start到end进行全部的倒换
reverseString(sb,0,sb.length()-1);
// 置换后从头到尾,然后找到空格处,进行每个单词的反转
reverseEachWord(sb);
return sb.toString();
}
public StringBuilder removeExtraSpace(String s){
//进行去除空格
int start =0;
int end = s.length()-1;
while(s.charAt(start) ==' ') start++;//这里用while,不是if
while(s.charAt(end)==' ') end--;
StringBuilder sb =new StringBuilder();
while(start<=end){
char c =s.charAt(start);
if(c !=' '|| sb.charAt(sb.length()-1) !=' '){
sb.append(c);
}
start++;
}
return sb;
}
public void reverseString(StringBuilder s ,int start ,int end ){
//exchange
while (start<=end){
char temp = s.charAt(start);
s.setCharAt(start,s.charAt(end));
s.setCharAt(end,temp);
start++;
end --;
}
}
public void reverseEachWord (StringBuilder sb){
int start =0;
int end = 1;
int n=sb.length();
while(start<n){
while(end <n && sb.charAt(end) !=' '){//这个目的是为了找到下一个不为空格的单词
end ++;
}
reverseString(sb,start,end-1);
start= end+1;
end = start+1;
}
}
}