题目描述
解题思路:
方法一:常规解法
要将字符串的每一个单词都反转,只需要将整个字符串都反转过来,再将每个单词反转就可以了。又因为字符串中还可能有多余的空格需要移除,所以这道题总共分为三步:
1.移除多余的空格
2.反转整个字符串
3.反转每一个单词
用 “ the sky is blue ” 举例说明,源字符串长度为 21。
移除多余的空格:“the sky is blue”(此时字符串的长度变为了 15)
反转整个字符串:“eulb si yks eht”
反转每一个单词:“blue is sky the”
// 反转字符串函数
void reverse(char * s,int start,int end) {
while (start < end) {
char temp = s[start];
s[start++] = s[end];
s[end--] = temp;
}
}
char * reverseWords(char * s) {
//1.移除多余的空格
int len = strlen(s);
int fast = 0, slow = 0;
//移除字符串之前的空格
while (s[fast] == ' ') {
fast++;
}
//移除单词之间多余的空格
while (fast < len -1) {
if (s[fast] == ' ' && s[fast + 1] == ' ') {
fast++;
} else {
s[slow++] = s[fast++];
}
// 移除字符串后面的空格
if (s[fast] == ' ') {
s[slow] = '\0';
} else {
s[slow++] = s[fast];
s[slow] = '\0';
}
// 2.反转整个字符串
reverse (s , 0, slow-1);
// 3.反转每一个单词
for (int i = 0; i < slow;i++) {
int j = i ;
while ( j < slow && s[j] ! = ' ') {
j++;
}
reverse(s, i ,j-1);
i = j;
}
return s;
}
方法二:栈
char * reverseWords(char * s){
//不是空格就入栈 空格出栈
int len = strlen(s);
if (len == 0) return s;
char *res = (char *)malloc(sizeof(char) * (len + 1));
res[len] = '\0';
char *Stack = (char *)malloc(sizeof(char) *(len + 1));
int top = 0;
int i,k = 0;
for(i = len - 1; i >= 0; i--){ //从后往前扫
while (i >= 0 && s[i] == ' ') //碰到空格继续i--
i--;
while (i >= 0 && s[i] !=' ') //碰到非空格字符进栈,连续进栈,直到碰到空格或i<0
Stack[top++] = s[i--];
while (top > 0) //经过上面while判断,此时i指向一个空格字符,栈中已经有一个单词,执行出栈
res[k++] = Stack[--top];
res[k++]=' '; //手动补上空格
}
k--; //k指向最后一个字符
while (k >=0 && res[k]== ' ') //当原字符串s第一个字符为空格时,res的后面会多一个空格
k--;
res[k+1] = '\0'; //字符串结束标志
return res;
}