字符串:双指针

2021-10-03 每日一题 LeetCode

# 0038. 外观数列 (opens new window)

题目

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

解析

递归,终止条件为 n = 1,双指针提取字符串中连续重复数字,将其转换成描述拼接到结果中。

代码

class Solution {
public:
    string countAndSay(int n) {
        if (n == 1) return "1";
        string s = countAndSay(n - 1);
        int len = s.length();

        string ans = "";
        for (int i = 0, j = 0; i < len; i++) {
            while (j < len && s[i] == s[j]) j++;
            ans += to_string(j - i) + s[i];
            i = j - 1;
        }
        return ans;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 0058. 最后一个单词的长度 (opens new window)

题目

给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

解析

从后向前遍历字符串,找到第一个非空字符的位置,之后继续向前遍历,直到遇到空格位置,记录两个位置的间隔,即为最后一个单词的长度。

代码

class Solution {
public:
    int lengthOfLastWord(string s) {
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s[i] == ' ') continue;
            int j = i - 1;
            while (j >= 0 && s[j] != ' ') j--;
            return i - j;
        }
        return 0;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
Last Updated: 2023-01-28 4:31:25