题目解释:
小U正在数偶数,偶数的定义是能够被2整除的非负整数,如 0,2,4,6,8,10,12,…0,2,4,6,8,10,12,…。小U将这些偶数一个接一个地按照字符拼接起来,形成一个无限长的字符串,例如:"024681012141618..."。
现在,小U想知道这个字符串的第 nn 个字符是什么。
题目的关键点:
-
字符拼接的规律:
- 小U是按照递增顺序数偶数,例如:0,2,4,6,8,…0,2,4,6,8,…,并把这些数字拼接成一个长字符串。
- 每个偶数可能占用1位(如0, 2, 4),也可能占用2位或更多(如10, 12, 14)。
- 拼接后的字符串就是一个无穷的字符串。
-
目标:
-
给定一个整数 nn,让我们返回该拼接字符串的第 nn 个字符。例如:
- 如果字符串是
"024681012141618...",n=6n=6 时,第6个字符是1。 - 如果 n=10n=10,第10个字符仍然是
1。 - 如果 n=15n=15,第15个字符是
8。
- 如果字符串是
-
-
字符串是动态生成的:
- 字符串长度理论上是无穷的,但我们只需要生成到满足第 nn 个字符位置即可。
- 需要对偶数生成和字符拼接进行优化,直到长度超过 nn。
解决思路:
-
生成偶数序列:
- 从 00 开始,逐次加 22 生成偶数序列。
- 将这些偶数逐个转为字符串并拼接在一起。
-
字符串拼接:
-
动态拼接字符串,直到字符串的长度大于或等于 nn。
-
比如:
- 偶数:00 拼接,字符串为
"0"。 - 偶数:22 拼接,字符串为
"02"。 - 偶数:44 拼接,字符串为
"024"。 - 偶数:66 拼接,字符串为
"0246",依此类推。
- 偶数:00 拼接,字符串为
-
-
找到第 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开始
步骤详解:
- 定义
sequence作为拼接字符串的容器,初始为空。 - 使用
current从 00 开始依次生成偶数,依次将其转为字符串并拼接到sequence中。 - 检查拼接后的
sequence是否足够长(即长度是否达到或超过 nn)。 - 当字符串长度足够时,直接取第 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。
时间复杂度:
- 偶数生成和拼接:每次生成一个偶数并拼接,时间复杂度约为 O(k)O(k),其中 kk 是生成的偶数个数。
- 最终复杂度:取决于 nn 的大小,通常为 O(n)O(n)。