C語言題解字符串變形算法示例
題引
對于一個長度為 n 字符串,我們需要對它做一些變形。
首先這個字符串中包含著一些空格,就像"Hello World"一樣,然后我們要做的是把這個字符串中由空格隔開的單詞反序,同時反轉(zhuǎn)每個字符的大小寫。
比如"Hello World"變形后就變成了"wORLD hELLO"。需要考慮字符串結(jié)尾是空格的情況。
數(shù)據(jù)范圍: 1≤n≤10^6106 , 字符串中包括大寫英文字母、小寫英文字母、空格。
進(jìn)階:空間復(fù)雜度 O(n) , 時間復(fù)雜度 O(n)
題目保證給定的字符串均由大小寫字母和空格構(gòu)成。
示例1.
輸入:
"This is a sample",16返回值:
"SAMPLE A IS tHIS"
示例2.
輸入:
"This is a sample ",17返回值:
" SAMPLE A IS tHIS"
示例3.
輸入:
"iOS",3返回值:
"Ios"
思路
解答代碼的思路:先按空格分割字符串,將分割后的字符串存入棧中,根據(jù)棧的特點,后面的單詞會先彈出,最后將出棧的字符串反轉(zhuǎn)大小寫后拼接成返回的字符串中。
寫法會更簡單的思路:是先遍歷整個字符串來反轉(zhuǎn)大小寫。然后分割字符串,入棧,出棧,拼接字符串。
還有雙逆轉(zhuǎn)的思路:也是先遍歷整個字符串來反轉(zhuǎn)大小寫。然后先逆轉(zhuǎn)一次整個字符串,再以空格為界逆轉(zhuǎn)每個單詞的字符串。
解答代碼
#include <string> #include <stack> class Solution { public: /** * @param s string字符串 * @param n int整型 * @return string字符串 */ string trans(string s, int n) { // write code here string res; res.reserve(n); stack<string> strs; string tmp; for (int i = 0; i < n; i++) { char c = s[i]; if (c != ' ') { tmp.push_back(c); } else { // 將空格隔開的字符串入棧 strs.push(tmp); tmp.clear(); } // 字符串結(jié)尾沒有空格,要將最后一個找到的字符串入棧 if (i == n-1 && !tmp.empty()) { strs.push(tmp); } } // 排除結(jié)尾空格的特殊情況 if (s[n - 1] == ' ') { res.push_back(' '); } while (!strs.empty()) { // 將找到的字符串一個個出棧 auto cur = strs.top(); strs.pop(); // 轉(zhuǎn)換大小寫 for (int i = 0; i < cur.size(); i++) { char c = cur[i]; // 65~90為26個大寫英文字母,97~122號為26個小寫英文字母,兩者相差32 char new_char = c >= 'a' && c <= 'z' ? c - 32 : c + 32; cur[i] = new_char; } res.append(cur); if (strs.size() > 0) { res.push_back(' '); } } return res; } };
以上就是C語言題解字符串變形方法示例的詳細(xì)內(nèi)容,更多關(guān)于C語言題解字符串變形的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言實現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點
這篇文章主要介紹了C語言實現(xiàn)輸出鏈表中倒數(shù)第k個節(jié)點,主要涉及鏈表的遍歷操作,是數(shù)據(jù)結(jié)構(gòu)中鏈表的常見操作。需要的朋友可以參考下2014-09-09C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07