文章目錄
- 看下去,你一定可以理解此題,寫的簡單易懂
- 力扣題目
- 解題思路
- 函數構成
- 1.反轉函數
- 2.消除掉多余空格函數
- 整體函數
看下去,你一定可以理解此題,寫的簡單易懂
力扣題目
給你一個字符串 s ,請你反轉字符串中 單詞 的順序。
單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。
返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。
注意:輸入字符串 s中可能會存在前導空格、尾隨空格或者單詞間的多個空格。返回的結果字符串中,單詞間應當僅用單個空格分隔,且不包含任何額外的空格。
示例 1:
輸入:s = “the sky is blue”
輸出:“blue is sky the”
示例 2:
輸入:s = " hello world "
輸出:“world hello”
解釋:反轉后的字符串中不能存在前導空格和尾隨空格。
示例 3:
輸入:s = “a good example”
輸出:“example good a”
解釋:如果兩個單詞間有多余的空格,反轉后的字符串需要將單詞間的空格減少到僅有一個。
解題思路
1.通過removeElement函數來去掉字符串中多余的0;
2.通過revise函數先反轉整個字符串;
3.在反轉每一個單詞,就達到了題目中的要求。
(反轉每一個單詞過程可以參考我的此篇文章-力扣-557. 反轉字符串中的單詞 III)
函數構成
1.反轉函數
void revise(char* start, char* end)
{char temp;while (start < end){temp = *end;*end = *start;*start = temp;start++;end--;}
}
只需要輸入反轉的起始地址和終止地址即可完成反轉
2.消除掉多余空格函數
int removeElement(char* str, int len, int val)
{int slow = 0; //慢指針int fast = 0; //快指針for (fast = 0; fast < len; fast++){if (val != str[fast])/*如果不是空格就賦值*/{if (slow != 0)/*確保字符串的最前邊沒有空格*/{str[slow] = ' ';slow++;}}while ((fast < len) && str[fast] != val)/*快指針遍歷一個完整的單詞賦值給慢指針*/{str[slow] = str[fast];slow++;fast++;}}str[slow] = '\0';return slow;
}
整體函數
void revise(char* start, char* end)
{char temp;while (start < end){temp = *end;*end = *start;*start = temp;start++;end--;}
}
int removeElement(char* str, int len, int val)
{int slow = 0; //慢指針int fast = 0; //快指針for (fast = 0; fast < len; fast++){if (val != str[fast])/*如果不是空格就賦值*/{if (slow != 0)/*確保字符串的最前邊沒有空格*/{str[slow] = ' ';slow++;}}while ((fast < len) && str[fast] != val)/*快指針遍歷一個完整的單詞賦值給慢指針*/{str[slow] = str[fast];slow++;fast++;}}str[slow] = '\0';return slow;
}char* reverseWords(char* s)
{char* start = NULL;char* end = NULL;int len = strlen(s);int i = 0;/*取得移除多余0后字符串的長度*/len = removeElement(s, len, ' ');/*反轉全部字符串*/revise(&s[0], &s[len - 1]);/*反轉每一個單詞*/start = s;/*字符串首地址賦值*/for (i = 0; i < len; i++){if (s[i] == ' '){end = &s[i];/*記錄空格的位置*/revise(start, end - 1);start = end + 1;/*記錄空格后字符的位置*/}else if (s[i + 1] == '\0')/*最后一個單詞特殊處理*/{end = &s[i];revise(start, end);start = NULL;}}return s;
}
如果有需要可以跳轉leetcode直接看我提交的解題:151. 反轉字符串中的單詞