小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
思路解析
- 生成偶数序列:我们可以从
0开始,依次生成偶数,并将它们转换为字符串。 - 拼接字符串:将这些偶数字符串拼接成一个长字符串。
- 查找第
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])
复杂度分析
时间复杂度分析
-
循环生成偶数并拼接字符串:
- 代码中使用了一个
while循环,循环的条件是len(concatenated_string) < n。 - 每次循环中,生成一个偶数并将其转换为字符串,然后拼接到
concatenated_string中。 - 这个循环的执行次数取决于
n的大小。具体来说,循环会执行到concatenated_string的长度达到或超过n为止。 - 由于每次循环生成一个偶数并拼接,循环的次数大约是
n的平方根级别。因为偶数的位数增长是线性的,而n是字符串的长度。
因此,循环的时间复杂度可以近似为
O(sqrt(n))。 - 代码中使用了一个
-
拼接字符串:
- 每次拼接字符串的操作是
O(1)的,因为 Python 的字符串拼接操作是常数时间复杂度。
- 每次拼接字符串的操作是
-
返回第
n个字符:- 返回第
n个字符的操作是O(1)的。
- 返回第
综合来看,整个函数的时间复杂度主要由循环决定,因此时间复杂度为 O(sqrt(n))。
空间复杂度分析
-
存储拼接的字符串:
concatenated_string存储了所有拼接的偶数字符串。- 由于每次循环生成一个偶数并拼接,
concatenated_string的长度最终会达到n级别。 - 因此,空间复杂度为
O(n)。
-
其他变量:
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)。