【水滴计划 | 每日两题】:替换空格、反转字符串中的单词

222 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

1、写在前面

大家好,我是翼同学,这里是【水滴计划 | 刷题日志】

每日两题,拒绝摆烂。

2、内容

2.1、题目一:剑指 Offer 05. 替换空格

链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

(3) 解题

class Solution {
public:
    string replaceSpace(string s) {
        // 字符串的原先长度
        int len = s.length();
        // 表示空格的数目
        int blank = 0;
        // for循环遍历字符串记录空格数目
        for (int i = 0; i < len; i++) {
            if (s[i] == ' ') blank++;
        }
        // 重置字符串的大小,扩充到每个空格替换成"%20"之后的大小空间
        s.resize(s.length() + blank * 2);
        // 取到扩容后的字符串长度
        int new_len = s.length();
        // 定义两个指针分别指向旧字符串的尾部和新字符串的尾部
        int left = len-1;
        int right = new_len-1;
        // 核心操作:从后往前替换相应的字符
        while(left < right) {
            // 如果该字符属于空格,则换成%20
            if(s[left] == ' ') {
                s[right] = '0';
                s[right - 1] = '2';
                s[right - 2] = '%';
                right -= 2;
            }
            // 如果不是空格,则直接代入字符
            else {
                s[right] = s[left];
            }
            // 最后更新指针变量
            left--;
            right--;
        }
        // 最后返回字符串
        return s;
    }
};

image.png

2.2、题目二:反转字符串中的单词

链接:151. 反转字符串中的单词 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

image.png

image.png

(3) 解题

"  hello world  "为例,解题思路如下:

  • 去掉多余空格: "hello world"
  • 将字符串反转:"dlrow olleh"
  • 所有单词反转:"world hello"
class Solution {
public:
    // 自定义函数:用于去除所有多余空格,并在相邻单词之间添加空格
    void removeExtraSpaces(string& s) {
        // 表示指向新字符串的下标
        int slow = 0;
        // for循环遍历字符串
        for (int i = 0; i < s.length(); ++i) {
            // 如果当前元素不是空格,则进行字符添加操作
            if (s[i] != ' ') {
                // 给各单词之间添加空格(slow != 0说明不是第一个单词)
                if (slow != 0) {
                    s[slow] = ' ';
                    slow++;
                }
                // 将当前的单词添加到新字符串中
                while (i < s.size() && s[i] != ' ') {
                    s[slow] = s[i];
                    slow++;
                    i++;
                }
            }
        }
        // 最后重置字符串的长度(表示字符串移除多余空格后的长度)
        s.resize(slow); 
    }

    // 自定义函数:用于反转字符串
    void reverse(string& s, int start, int end){
        for (int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }

    // 主函数
    string reverseWords(string s) {
        // 将多余空格去除掉。
        removeExtraSpaces(s); 

        // 反转字符串
        reverse(s, 0, s.size() - 1);

        // 定义一个变量用于指向每个单词的首下标
        int start = 0;

        // for循环遍历字符串
        for (int i = 0; i <= s.size(); ++i) {
            // 如果字符串到达尾部或者当前字符等于空格,说明遇到一个单词结束,进行反转单词
            if (i == s.size() || s[i] == ' ') {
                reverse(s, start, i - 1);
                start = i + 1; 
            }
        }
        // 最后返回运算结果
        return s;
    }
};

image.png

3、写在最后

好了,今天就刷到这里,明天再来。