派派的刷题之旅(五) | 豆包MarsCode AI 刷题

116 阅读3分钟

小U数数

问题描述

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

测试样例

样例1:

输入:n = 6
输出:1

样例2:

输入:n = 10
输出:1

样例3:

输入:n = 15
输出:8

思路解析

  1. 生成偶数序列:我们可以从 0 开始,依次生成偶数,并将它们转换为字符串。
  2. 拼接字符串:将这些偶数字符串拼接成一个长字符串。
  3. 查找第 n 个字符:直接从这个长字符串中取出第 n 个字符。

解题代码

def solution(n: int) -> int:
    # 初始化一个空字符串来存储拼接的偶数字符串
    concatenated_string = ""
    
    # 初始化一个变量来生成偶数
    even_number = 0
    
    # 循环生成偶数并拼接
    while len(concatenated_string) < n:
        # 将当前偶数转换为字符串并拼接到总字符串中
        concatenated_string += str(even_number)
        # 生成下一个偶数
        even_number += 2
    
    # 返回第 n 个字符
    return int(concatenated_string[n-1])

复杂度分析

时间复杂度分析

  1. 循环生成偶数并拼接字符串

    • 代码中使用了一个 while 循环,循环的条件是 len(concatenated_string) < n
    • 每次循环中,生成一个偶数并将其转换为字符串,然后拼接到 concatenated_string 中。
    • 这个循环的执行次数取决于 n 的大小。具体来说,循环会执行到 concatenated_string 的长度达到或超过 n 为止。
    • 由于每次循环生成一个偶数并拼接,循环的次数大约是 n 的平方根级别。因为偶数的位数增长是线性的,而 n 是字符串的长度。

    因此,循环的时间复杂度可以近似为 O(sqrt(n))

  2. 拼接字符串

    • 每次拼接字符串的操作是 O(1) 的,因为 Python 的字符串拼接操作是常数时间复杂度。
  3. 返回第 n 个字符

    • 返回第 n 个字符的操作是 O(1) 的。

综合来看,整个函数的时间复杂度主要由循环决定,因此时间复杂度为 O(sqrt(n))

空间复杂度分析

  1. 存储拼接的字符串

    • concatenated_string 存储了所有拼接的偶数字符串。
    • 由于每次循环生成一个偶数并拼接,concatenated_string 的长度最终会达到 n 级别。
    • 因此,空间复杂度为 O(n)
  2. 其他变量

    • even_number 和 n 都是常数空间复杂度 O(1)

综合来看,整个函数的空间复杂度为 O(n)

总结

  • 时间复杂度O(sqrt(n))
  • 空间复杂度O(n)

总结与思考

初始化变量:初始化一个空字符串 concatenated_string 和一个偶数变量 even_number

循环生成并拼接:使用 while 循环生成偶数并将其转换为字符串后拼接到 concatenated_string 中,直到字符串长度达到或超过 n

返回第 n 个字符:直接从 concatenated_string 中返回第 n 个字符(注意索引从 0 开始,所以是 n-1)。