C語言題解字符串變形算法示例
題引
對于一個長度為 n 字符串,我們需要對它做一些變形。
首先這個字符串中包含著一些空格,就像"Hello World"一樣,然后我們要做的是把這個字符串中由空格隔開的單詞反序,同時反轉(zhuǎn)每個字符的大小寫。
比如"Hello World"變形后就變成了"wORLD hELLO"。需要考慮字符串結(jié)尾是空格的情況。
數(shù)據(jù)范圍: 1≤n≤10^6106 , 字符串中包括大寫英文字母、小寫英文字母、空格。
進階:空間復(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語言題解字符串變形方法示例的詳細內(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-09
C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

