算法题 | 豆包MarsCode AI刷题

111 阅读2分钟

1.连续数字差绝对值为k的问题

ddd96bcc1f8f77677d623198003cc341.png

这个题目要求我们找出所有长度为 nn 且满足其每两个连续位上的数字之间的差的绝对值为 kk 的非负整数。我们需要注意以下几点:

  1. 数字不能有前导零,除了数字0本身。
  2. 我们需要从小到大返回所有符合条件的整数。

接下来,我们来看代码是如何实现这个功能的:

函数 solution(n: int, k: int) -> list:

这个函数用来找出所有符合条件的整数。它定义了一个内部函数 dfs(current: str, length: int),这是一个深度优先搜索(DFS)函数,用来递归地构建符合条件的数字。

dfs 函数首先检查当前数字的长度是否已经达到 nn。如果是,它将当前数字添加到结果列表中。

然后,它获取当前数字的最后一位。接着,它尝试在最后一位数字上加上 kk,如果结果不超过9,它将递归地调用 dfs 函数来构建下一个数字。

同样地,它也尝试在最后一位数字上减去 kk,如果结果不小于0,它也将递归地调用 dfs 函数。

在 solution 函数中,我们首先检查 nn 是否为1。如果是,我们将0添加到结果列表中,因为0是唯一符合条件的数字。

然后,我们从1到9的每个数字开始,调用 dfs 函数来构建符合条件的数字。

最后,我们返回排序后的结果列表。

代码如下:

def solution(n: int, k: int) -> list:

    def dfs(current: str, length: int):
       
        if length == n:
            result.append(int(current))
            return

        last_digit = int(current[-1])

        if last_digit + k <= 9:
            dfs(current + str(last_digit + k), length + 1)

        if k != 0 and last_digit - k >= 0:
            dfs(current + str(last_digit - k), length + 1)

    result = []
    if n==1:
            result.append(0)
            
    for i in range(1, 10): 
        dfs(str(i), 1)

    return sorted(result) 

现在,我们可以使用这个函数来找出所有长度为 nn 且满足其每两个连续位上的数字之间的差的绝对值为 kk 的非负整数。

在深度优先搜索(DFS)算法中,我们通过递归地探索所有可能的路径来解决问题。

让我们详细分析一下 dfs 函数的工作原理:

函数定义、终止条件、获取最后一位数字、尝试加上 kk、尝试减去 kk

通过这种方式,dfs 函数逐步构建所有可能的数字,并检查它们是否满足题目中的条件。这种递归搜索方法确保了我们不会错过任何可能的数字,同时也避免了不必要的计算。