题目


对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。需要考虑字符串结尾是空格的情况。

数据范围: 1≤n≤\(10^6\) , 字符串中包括大写英文字母、小写英文字母、空格。

进阶:空间复杂度 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;
    }
};

吴尼玛
32 声望11 粉丝

记问之学