日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 151. 翻转字符串里的单词 c代码 三种方案

發布時間:2025/4/5 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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代码 三种方案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。