C語(yǔ)言題解字符串變形算法示例
題引
對(duì)于一個(gè)長(zhǎng)度為 n 字符串,我們需要對(duì)它做一些變形。
首先這個(gè)字符串中包含著一些空格,就像"Hello World"一樣,然后我們要做的是把這個(gè)字符串中由空格隔開(kāi)的單詞反序,同時(shí)反轉(zhuǎn)每個(gè)字符的大小寫(xiě)。
比如"Hello World"變形后就變成了"wORLD hELLO"。需要考慮字符串結(jié)尾是空格的情況。
數(shù)據(jù)范圍: 1≤n≤10^6106 , 字符串中包括大寫(xiě)英文字母、小寫(xiě)英文字母、空格。
進(jìn)階:空間復(fù)雜度 O(n) , 時(shí)間復(fù)雜度 O(n)
題目保證給定的字符串均由大小寫(xiě)字母和空格構(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ù)棧的特點(diǎn),后面的單詞會(huì)先彈出,最后將出棧的字符串反轉(zhuǎn)大小寫(xiě)后拼接成返回的字符串中。
寫(xiě)法會(huì)更簡(jiǎn)單的思路:是先遍歷整個(gè)字符串來(lái)反轉(zhuǎn)大小寫(xiě)。然后分割字符串,入棧,出棧,拼接字符串。
還有雙逆轉(zhuǎn)的思路:也是先遍歷整個(gè)字符串來(lái)反轉(zhuǎn)大小寫(xiě)。然后先逆轉(zhuǎn)一次整個(gè)字符串,再以空格為界逆轉(zhuǎn)每個(gè)單詞的字符串。
解答代碼
#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 { // 將空格隔開(kāi)的字符串入棧 strs.push(tmp); tmp.clear(); } // 字符串結(jié)尾沒(méi)有空格,要將最后一個(gè)找到的字符串入棧 if (i == n-1 && !tmp.empty()) { strs.push(tmp); } } // 排除結(jié)尾空格的特殊情況 if (s[n - 1] == ' ') { res.push_back(' '); } while (!strs.empty()) { // 將找到的字符串一個(gè)個(gè)出棧 auto cur = strs.top(); strs.pop(); // 轉(zhuǎn)換大小寫(xiě) for (int i = 0; i < cur.size(); i++) { char c = cur[i]; // 65~90為26個(gè)大寫(xiě)英文字母,97~122號(hào)為26個(gè)小寫(xiě)英文字母,兩者相差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語(yǔ)言題解字符串變形方法示例的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言題解字符串變形的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C語(yǔ)言求解最長(zhǎng)公共子字符串問(wèn)題及相關(guān)的算法分析
- 一些C語(yǔ)言中字符串的算法問(wèn)題解決實(shí)例小結(jié)
- C語(yǔ)言中壓縮字符串的簡(jiǎn)單算法小結(jié)
- C語(yǔ)言堆排序經(jīng)典算法TopK問(wèn)題解析
- C語(yǔ)言算法積累圖的遍歷鄰接表簡(jiǎn)單路徑
- C語(yǔ)言算法積累分離數(shù)位示例
- C語(yǔ)言算法積累加tag的循環(huán)隊(duì)列
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列示例
- C語(yǔ)言植物大戰(zhàn)數(shù)據(jù)結(jié)構(gòu)希爾排序算法
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)輸出鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸出鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn),主要涉及鏈表的遍歷操作,是數(shù)據(jù)結(jié)構(gòu)中鏈表的常見(jiàn)操作。需要的朋友可以參考下2014-09-09C語(yǔ)言文件操作函數(shù)freopen詳細(xì)解析
替換一個(gè)流,或者說(shuō)重新分配文件指針,實(shí)現(xiàn)重定向。如果stream流已經(jīng)打開(kāi),則先關(guān)閉該流。如果該流已經(jīng)定向,則freopen將會(huì)清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開(kāi)一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)出錯(cuò)2013-10-10深入C語(yǔ)言把文件讀入字符串以及將字符串寫(xiě)入文件的解決方法
本篇文章是對(duì)C語(yǔ)言把文件讀入字符串以及將字符串寫(xiě)入文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05c++統(tǒng)計(jì)文件中字符個(gè)數(shù)代碼匯總
本文給大家匯總介紹了3種使用C++實(shí)現(xiàn)統(tǒng)計(jì)文件中的字符個(gè)數(shù)的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-09-09C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07