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