C語(yǔ)言題解字符串變形算法示例
題引
對(duì)于一個(gè)長(zhǎng)度為 n 字符串,我們需要對(duì)它做一些變形。
首先這個(gè)字符串中包含著一些空格,就像"Hello World"一樣,然后我們要做的是把這個(gè)字符串中由空格隔開的單詞反序,同時(shí)反轉(zhuǎn)每個(gè)字符的大小寫。
比如"Hello World"變形后就變成了"wORLD hELLO"。需要考慮字符串結(jié)尾是空格的情況。
數(shù)據(jù)范圍: 1≤n≤10^6106 , 字符串中包括大寫英文字母、小寫英文字母、空格。
進(jìn)階:空間復(fù)雜度 O(n) , 時(shí)間復(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ù)棧的特點(diǎn),后面的單詞會(huì)先彈出,最后將出棧的字符串反轉(zhuǎn)大小寫后拼接成返回的字符串中。
寫法會(huì)更簡(jiǎn)單的思路:是先遍歷整個(gè)字符串來(lái)反轉(zhuǎn)大小寫。然后分割字符串,入棧,出棧,拼接字符串。
還有雙逆轉(zhuǎn)的思路:也是先遍歷整個(gè)字符串來(lái)反轉(zhuǎn)大小寫。然后先逆轉(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 {
// 將空格隔開的字符串入棧
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)換大小寫
for (int i = 0; i < cur.size(); i++) {
char c = cur[i];
// 65~90為26個(gè)大寫英文字母,97~122號(hào)為26個(gè)小寫英文字母,兩者相差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-09
C語(yǔ)言文件操作函數(shù)freopen詳細(xì)解析
替換一個(gè)流,或者說(shuō)重新分配文件指針,實(shí)現(xiàn)重定向。如果stream流已經(jīng)打開,則先關(guān)閉該流。如果該流已經(jīng)定向,則freopen將會(huì)清除該定向。此函數(shù)一般用于將一個(gè)指定的文件打開一個(gè)預(yù)定義的流:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或者標(biāo)準(zhǔn)出錯(cuò)2013-10-10
深入C語(yǔ)言把文件讀入字符串以及將字符串寫入文件的解決方法
本篇文章是對(duì)C語(yǔ)言把文件讀入字符串以及將字符串寫入文件的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
c++統(tǒng)計(jì)文件中字符個(gè)數(shù)代碼匯總
本文給大家匯總介紹了3種使用C++實(shí)現(xiàn)統(tǒng)計(jì)文件中的字符個(gè)數(shù)的方法,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-09-09
C++實(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

