青训营X豆包MarsCode 技术训练营 | 豆包MarsCode AI 刷题

23 阅读2分钟

问题描述:

小U数数,问题描述,小U正在数偶数,从0,2,4,6,8,10,12,…开始,依次将这些数连在一起,形成一,个无穷长的字符串,例如:"0246810121416..."。小U想知道这个字符串中的第n,个字符是什么。

解题思路:

顺序生成偶数,并将这些偶数依次转换为字符串,然后逐个字符地检查,直到找到目标位置(第n个字符)的字符。

解题过程:

初始化变量 num:用于记录当前正在处理的偶数,初始化为0。 count:用于记录当前已经数到的字符总数,初始化为0。 循环: 使用一个无限循环(while (true))来不断生成偶数并检查它们的字符。 生成偶数并转换为字符串: 在每次循环中,将当前的偶数num转换为字符串numStr遍历字符串: 遍历字符串numStr中的每个字符c。 每次遍历到一个字符时,将count增加1。 检查count是否等于n,如果等于,则找到了目标字符,将其转换为数字(通过c - '0')并返回。(这里利用了字符在 ASCII 码表中的规律,数字字符与它所表示的数字之间的差值是固定的,通过减去字符'0'的 ASCII 码值,就可以得到该字符所表示的实际数字。) 更新偶数: 如果当前字符串的字符遍历完毕后还没有找到目标字符,则将num增加2以生成下一个偶数,继续下一次循环。 返回结果: 一旦找到目标字符,返回其对应的数字值。 理论上,由于这是一个无限循环,只要n是合理的(即大于0),总会找到对应的字符。 通过这样不断地生成偶数、转换为字符串并逐个字符计数的过程,最终能够找到并返回无穷长字符串中的第个字符所对应的数字。 至此思路已经完成。

代码

#include <iostream>
using namespace std;

int solution(int n) {
    // 用于记录当前已经处理到的偶数
    int num = 0;
    // 用于记录当前已经数到的字符位置
    int count = 0;

    while (true) {
        // 将当前偶数转换为字符串
        string numStr = to_string(num);
        for (char c : numStr) {
            count++;
            if (count == n) {
                // 如果数到了第n个字符,返回该字符对应的数字
                return c - '0';
            }
        }
        num += 2;
    }

    return 0;
}

int main() {
    cout << (solution(6) == 1) << endl;
    cout << (solution(10) == 1) << endl;
    cout << (solution(15) == 8) << endl;
    return 0;
}