题目
对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。需要考虑字符串结尾是空格的情况。
数据范围: 1≤n≤106 , 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 O(n) , 时间复杂度 O(n)
题目保证给定的字符串均由大小写字母和空格构成。
示例1
输入:
"This is a sample",16
返回值:
"SAMPLE A IS tHIS"
示例2
输入:
"This is a sample ",17
返回值:
" SAMPLE A IS tHIS"
示例3
输入:
"iOS",3
返回值:
"Ios"
思路
解答代码的思路:先按空格分割字符串,将分割后的字符串存入栈中,根据栈的特点,后面的单词会先弹出,最后将出栈的字符串反转大小写后拼接成返回的字符串中。
写法会更简单的思路:是先遍历整个字符串来反转大小写。然后分割字符串,入栈,出栈,拼接字符串。
还有双逆转的思路:也是先遍历整个字符串来反转大小写。然后先逆转一次整个字符串,再以空格为界逆转每个单词的字符串。
解答代码
#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();
}
// 字符串结尾没有空格,要将最后一个找到的字符串入栈
if (i == n-1 && !tmp.empty()) {
strs.push(tmp);
}
}
// 排除结尾空格的特殊情况
if (s[n - 1] == ' ') {
res.push_back(' ');
}
while (!strs.empty()) {
// 将找到的字符串一个个出栈
auto cur = strs.top();
strs.pop();
// 转换大小写
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;
}
};
网友评论