0
点赞
收藏
分享

微信扫一扫

LeetCode面试题Day9|LeetCode58 最后一个单词的长度、LeetCode151 反转字符串中的单词

左手梦圆 2024-08-17 阅读 15

题目1:

指路:

. - 力扣(LeetCode)58 最后一个单词的长度

思路与分析:

求最后一个单词的长度,最普遍的思路应该是从后往前遍历,定义一个计数器,遇到第一个非空格的字母则使计数器加一,直到遇到空格停止,此时计数器的值就是最后一个单词长度。

代码:

class Solution {
public:
    int lengthOfLastWord(string s) {
    int ans = 0;  // 单词长度
    for (int i = s.size() - 1; i >= 0; i--) {
        if (s[i] != ' ') ans++;  // 非空格长度加1
        if (ans != 0 && s[i] == ' ') break;
    }
    return ans;
    }
};

题目2:

指路:

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

思路与分析:

两个工作:将字符串中的单词翻转顺序并去除多于一个的空格。首先完成单词的翻转。很显然定义两个下标分别指向字符串的首尾,通过swap函数进行交换。接下来进行多余空格的去除,核心思想为去除单词间的所有空格最后在单词间添加一个空格。其中,定义一个满指针slow,其含义为去除多余空格后的大小。最后还需保证字符串中首尾没有多余空格。

代码:

class Solution {
public:
    void reverse(string& s, int start, int end) {
        for (int i = start, j = end ; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
    
    void removeExtraSpace(string& s) {
        int slow = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] != ' ') {
                if (slow != 0)
                s[slow++] = ' ';
                while (i < s.size() && s[i] != ' ') {
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow);
    }

    string reverseWords(string s) {
    removeExtraSpace(s);
    reverse(s, 0, s.size() - 1);
    int start = 0;
    for (int i = 0; i <= s.size(); i++) {
        if (i == s.size() || s[i] == ' ') {
            reverse(s, start, i - 1);
            start = i + 1;
        }
    }
    return s;
    }
};
举报

相关推荐

0 条评论