leetcode 151. 翻转字符串里的单词 c代码 三种方案
生活随笔
收集整理的這篇文章主要介紹了
leetcode 151. 翻转字符串里的单词 c代码 三种方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如題:
給定一個字符串,逐個翻轉字符串中的每個單詞。示例 1: 輸入: "the sky is blue" 輸出:?"blue is sky the"示例 2: 輸入: " ?hello world! ?" 輸出:?"world! hello" 解釋: 輸入字符串可以在前面或者后面包含多余的空格,但是反轉后的字符不能包括。示例 3: 輸入: "a good ? example" 輸出:?"example good a" 解釋: 如果兩個單詞間有多余的空格,將反轉后單詞間的空格減少到只含一個說明: 無空格字符構成一個單詞。 輸入字符串可以在前面或者后面包含多余的空格,但是反轉后的字符不能包括。 如果兩個單詞間有多余的空格,將反轉后單詞間的空格減少到只含一個。進階: 請選用 C 語言的用戶嘗試使用?O(1) 額外空間復雜度的原地解法。這道題在數組專項練習遇到過,第一反應就是簡單,沒多想,上去就是擼代碼,結果考慮邊界用時N分鐘,暈了過去。
回過頭仔細思考了下,這道題邏輯不難,但是邊界處理部分很重要,稍有不慎就會出錯,尤其是c語言。
方案大概有三種:
方法1:從后往前逐個拷貝單詞到另一個數組中,需要使用額外數組空間N。
方法2:像鏡像一樣,先反轉整個字符串,然后逐個反轉每個單詞,最后去除頭部空格,中間空格以及尾部空格。此方案優點是空間復雜度低。
方法3:使用棧,從后往前將單詞入棧,然后順序出棧即可,同方法1一樣,需要使用額外輔助空間。
題目進階要求c語言使用O(1)復雜度,方案2可滿足要求。三種方案都不復雜,但是代碼實現還是很能考驗水平,建議多練。
下面是方案2 鏡像反轉的c代碼實現:
/** 特殊情況:參數為空或者長度小于1* 方法1:從后往前逐個拷貝單詞到另一個數組* 方法2:反轉整個字符串,然后反轉每個單詞* 方法3: 從后往前應該使用棧*/void swap(char *a, char *b) {*a = *a ^ *b;*b = *a ^ *b;*a = *a ^ *b; }void reverseWord(char *s, int first, int end) {if (first == end)return;while(first < end)swap(s+(first++), s+(end--));return; }char * reverseWords(char * s){int i, j, first, last,len,c;char *p, clast;//參數為空或者長度為0返回if (!s || strlen(s) < 1)return s;//反轉字符串len = strlen(s);for (i = 0, j = len - 1; i < j;){if (s[i] != s[j])swap(s+(i++), s+(j--));else{i++; j--;} }//反轉每個單詞last = first = 0;while (1){while(first < len && s[first] == ' ')first++; if (first >= len)break;else{last = first;while(last < len && s[last] != ' ')last++;reverseWord(s, first, last - 1);}if (last >= len)break;first = last;}printf("%s\n", s);//去除開頭空格i = 0;while(i < len && s[i] == ' '){len--;s++;} if (len < 0)return s;//刪除多余空格for (i = 0, j = 0, c = 0; i < len-1; i++){while (i < len - 1 && s[i] == ' ' && s[i] == s[i+1]){c++; i++;}if (c && i < len - 1 && s[i+1] != ' '){i++;while(i < len && s[i] != ' '){swap(s+i-c, s+i);i++;}i--;}}//去除末尾空格len = strlen(s);while(len > 0 && s[len-1] == ' '){s[len-1] = '\0';len--;}return s; }=============================================================================================
Linux應用程序、內核、驅動開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
總結
以上是生活随笔為你收集整理的leetcode 151. 翻转字符串里的单词 c代码 三种方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚊子有内脏吗
- 下一篇: 忞怎么读,什么意思?