小U数数| 豆包MarsCode AI刷题

98 阅读3分钟

题目解释:

小U正在数偶数,偶数的定义是能够被2整除的非负整数,如 0,2,4,6,8,10,12,…0,2,4,6,8,10,12,…。小U将这些偶数一个接一个地按照字符拼接起来,形成一个无限长的字符串,例如:"024681012141618..."

现在,小U想知道这个字符串的第 nn 个字符是什么。


题目的关键点:

  1. 字符拼接的规律

    • 小U是按照递增顺序数偶数,例如:0,2,4,6,8,…0,2,4,6,8,…,并把这些数字拼接成一个长字符串。
    • 每个偶数可能占用1位(如0, 2, 4),也可能占用2位或更多(如10, 12, 14)。
    • 拼接后的字符串就是一个无穷的字符串。
  2. 目标

    • 给定一个整数 nn,让我们返回该拼接字符串的第 nn 个字符。例如:

      • 如果字符串是 "024681012141618...",n=6n=6 时,第6个字符是 1
      • 如果 n=10n=10,第10个字符仍然是 1
      • 如果 n=15n=15,第15个字符是 8
  3. 字符串是动态生成的

    • 字符串长度理论上是无穷的,但我们只需要生成到满足第 nn 个字符位置即可。
    • 需要对偶数生成和字符拼接进行优化,直到长度超过 nn。

解决思路:

  1. 生成偶数序列

    • 从 00 开始,逐次加 22 生成偶数序列。
    • 将这些偶数逐个转为字符串并拼接在一起。
  2. 字符串拼接

    • 动态拼接字符串,直到字符串的长度大于或等于 nn。

    • 比如:

      • 偶数:00 拼接,字符串为 "0"
      • 偶数:22 拼接,字符串为 "02"
      • 偶数:44 拼接,字符串为 "024"
      • 偶数:66 拼接,字符串为 "0246",依此类推。
  3. 找到第 nn 个字符

    • 当字符串长度超过 nn 时,直接返回字符串的第 n−1n−1 个字符(因为索引从 0 开始)。

代码实现细节:

以下是代码逻辑分解:

python
复制代码
def solution(n):
    sequence = ""  # 用于存储拼接后的字符串
    current = 0    # 当前偶数,从0开始

    # 持续生成字符串,直到长度 >= n
    while len(sequence) < n:
        sequence += str(current)  # 将当前偶数转为字符串并拼接
        current += 2             # 生成下一个偶数

    # 返回字符串中的第 n 个字符
    return int(sequence[n - 1])  # 注意Python索引从0开始

步骤详解:

  1. 定义 sequence 作为拼接字符串的容器,初始为空。
  2. 使用 current 从 00 开始依次生成偶数,依次将其转为字符串并拼接到 sequence 中。
  3. 检查拼接后的 sequence 是否足够长(即长度是否达到或超过 nn)。
  4. 当字符串长度足够时,直接取第 n−1n−1 个字符(因为索引从 00 开始)。

示例详解:

示例 1:

输入:n=6n=6

  • 偶数序列拼接:

    • 第一步:"0"
    • 第二步:"024"
    • 第三步:"02468"
    • 第四步:"0246810"(长度超过 66)
  • 第 66 个字符是 1,返回 1

示例 2:

输入:n=10n=10

  • 偶数序列拼接:

    • 第一步:"0"
    • 第二步:"024"
    • 第三步:"02468"
    • 第四步:"024681012"(长度超过 1010)
  • 第 1010 个字符是 1,返回 1

示例 3:

输入:n=15n=15

  • 偶数序列拼接:

    • 第一步:"0"
    • 第二步:"024"
    • 第三步:"02468"
    • 第四步:"0246810121416"(长度超过 1515)
  • 第 1515 个字符是 8,返回 8


时间复杂度:

  1. 偶数生成和拼接:每次生成一个偶数并拼接,时间复杂度约为 O(k)O(k),其中 kk 是生成的偶数个数。
  2. 最终复杂度:取决于 nn 的大小,通常为 O(n)O(n)。