小u数数 &小s的字符串解压缩 | 豆包MarsCode AI刷题

113 阅读3分钟

1. 小u数数

题目描述: 找到第 n 个偶数,并返回该偶数的第 k 个数字。

解题思路

  1. 初始化变量

    • current_number:当前偶数,初始为 0。
    • current_length:当前偶数数字的长度,初始为 0。
  2. 循环遍历偶数

    • 将当前偶数转换为字符串,并计算其长度。

    • 判断当前偶数字符串长度是否包含第 n 个字符。

      • 如果包含,找到第 n 个字符,并返回其数字。
      • 如果不包含,更新总长度,并将当前偶数加 2。
  3. 重复步骤 2,直到找到第 n 个偶数的第 k 个数字

```#include <iostream>
using namespace std;

int solution(int n) {
    int current_number = 0;
    int current_length = 0;
    
    while (true) {
        // 将当前偶数转换为字符串
        string current_str = to_string(current_number);
        int str_length = current_str.length();
        
        // 判断当前字符串是否包含第 n 个字符
        if (current_length + str_length >= n) {
            // 找到第 n 个字符
            int index_in_str = n - current_length - 1;
            return current_str[index_in_str] - '0';
        }
        
        // 更新总长度
        current_length += str_length;
        // 生成下一个偶数
        current_number += 2;
    }
}
int main() {
    cout << (solution(6) == 1) << endl;
    cout << (solution(10) == 1) << endl;
    cout << (solution(15) == 8) << endl;
    return 0;
}

```js

AI 刷题思路

  1. 优化循环条件: 可以使用数学公式直接计算第 n 个偶数的值,避免循环遍历。
  2. 使用位运算: 可以使用位运算符快速判断偶数,例如 current_number & 1 == 0

2. 小s的字符串解压缩

题目描述: 给定一个字符串 s 和一个整数 n,将 s 重复 n 次并按照特定规则解压缩,返回解压缩后的字符串。

解题思路

  1. 初始化变量

    • ans:解压缩后的字符串,初始为空。
    • i:字符串 s 的索引,初始为 0。
  2. 遍历字符串 s

    • 判断当前字符是否为字母。

      • 如果是字母,将其添加到结果字符串 ans 中。
      • 如果下一个字符是数字,读取完整的数字,并将前面的字母重复该数字次。
    • 如果当前字符不是字母,直接移动到下一个字符。

  3. 重复步骤 2,直到遍历完字符串 s

```#include <iostream>
#include <string>

using namespace std;

std::string solution(int n, const std::string& s) {
    string ans;
    for (int i = 0; i < n; ) {
        char c = s[i];

        // 如果是字母
        if (isalpha(c)) {
            ans += c; // 将字母添加到结果字符串
            i++; // 移动到下一个字符

            // 检查下一个字符是否是数字
            if (i < n && isdigit(s[i])) {
                int res = 0;

                // 读取完整的数字
                while (i < n && isdigit(s[i])) {
                    res = res * 10 + (s[i] - '0');
                    i++;
                }

                // 将前面的字符重复 res 次
                ans.append(res - 1, c); // 因为已经添加了一次c,所以要减一
            }
        }
        else {
            i++; // 如果不是字母,直接移动到下一个字符
        }
    }
    return ans;
}

int main() {
    std::cout << (solution(9, "a2b3cde3f") == "aabbbcdeeef") << std::endl;
    std::cout << (solution(10, "x44yz5mn51") == "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyzzzzzmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn") << std::endl;
    std::cout << (solution(6, "adbc2d") == "adbccd") << std::endl;
    return 0;
}


```js

AI 刷题思路

  1. 使用状态机: 可以使用状态机来解析字符串 s,并根据当前状态进行不同的操作。
  2. 使用栈: 可以使用栈来存储未重复的字符和重复次数,从而简化代码逻辑。