小U数数-简单题|豆包MarsCodeAI刷题

70 阅读4分钟

小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

题目解析

这道题很短,信息比较集中,这道题目要求我们根据给定的一个位置 n,找出在由所有偶数从小到大按顺序排列组成的无穷字符串中,第 n 个字符是什么。字符串从 0 开始,按如下顺序排列:"0246810121416...",即将所有的偶数从 0 开始,依次连接成一个长字符串。

1. 字符串的构造

首先,我们需要明确构造这个无穷长字符串的规则。字符串从 0 开始,接着是 2, 4, 6, 8, 10, 12, 14, ...,每个偶数在字符串中都占有一定的字符长度:

  • 0 占一个字符
  • 2 占一个字符
  • 4 占一个字符
  • 6 占一个字符
  • 8 占一个字符
  • 10 占两个字符
  • 12 占两个字符
  • 14 占两个字符
  • 依此类推

可以看到,单个数字偶数(如 0, 2, 4, 6, 8)占一个字符,而两位数的偶数(如 10, 12, 14)占两个字符,三位数的偶数占三个字符,等等。

2. 分析如何找到第 n 个字符

对于任意给定的 n,我们需要计算这个无穷字符串中的第 n 个字符在哪个偶数中,以及它是该偶数的哪个位置。可以通过以下几个步骤来解决:

  1. 逐步生成偶数,计算它们所占字符的总数
    0 开始,我们逐个生成偶数并计算它们所占的字符数。对于每个偶数,若是一个两位数,就占两个字符,若是三位数,则占三个字符,依此类推。
  2. 累加字符数,直到找出第 n 个字符所在的偶数
    我们从 0 开始,逐个生成偶数,并累加字符数,直到累加的字符数大于或等于 n。当累加的字符数超过 n 时,我们就找到了第 n 个字符所在的偶数。
  3. 计算该偶数中的第几个字符
    一旦找到目标偶数,我们就可以通过简单的计算找出这个偶数中的第几个字符是目标字符。
3. 具体实现

具体实现时,可以通过一个循环来遍历所有的偶数,并累加字符数,直到找到目标位置。下面是一个简单的实现思路:

def find_nth_character(n):
    num = 0  # 偶数起始值
    length = 0  # 累积字符数
    
    while True:
        num_str = str(num)  # 将当前偶数转换为字符串
        length += len(num_str)  # 增加当前偶数的字符长度
        if length >= n:  # 当累积的字符数大于或等于n时,找到目标偶数
            return num_str[n - (length - len(num_str)) - 1]  # 计算第n个字符
        num += 2  # 下一偶数

# 测试用例
print(find_nth_character(6))  # 输出 1
print(find_nth_character(10)) # 输出 1
print(find_nth_character(15)) # 输出 8
4. 时间复杂度分析

这个算法的时间复杂度主要取决于我们遍历偶数的数量。对于每个偶数,我们只需要将其转换为字符串并计算其长度,直到字符总数达到或超过 n。由于偶数的字符数随着数字的增大而增长,因此总的计算次数并不是很高,可以认为是线性时间复杂度。具体时间复杂度是 O(m),其中 m 是找到第 n 个字符时需要遍历的偶数的个数。

5. 思考与优化

这道题目的核心在于如何高效地定位第 n 个字符所在的位置。虽然上述代码已经较为简单直接,但随着 n 的增大,可能需要遍历大量的偶数。如果想进一步优化,可以考虑通过数学推导,直接估算出大致的偶数范围,而不是逐个遍历。

例如,计算每个数字的字符长度时,我们可以根据偶数的位数分组,首先计算一位数的偶数占的字符数,再计算二位数的占的字符数,再到三位数的,依此类推。这种方法可以加速定位过程,减少不必要的计算。

6. 总结

这道题目考察了我们如何利用字符串拼接和字符位置查找的方式解决问题。通过逐步积累字符的长度并找出目标字符所在的位置,我们可以高效地求解此类问题。