494.连续数字差绝对值为K的问题 题解及思路 | 豆包MarsCode AI刷题

1 阅读4分钟

494.连续数字差绝对值为K的问题 题解及思路

494.连续数字差绝对值为K的问题

问题描述

题目描述如下:

小R正在研究一些数字生成的有趣性质。他需要找出所有长度为 n 且满足其每两个连续位上的数字之间的差的绝对值为 k 的非负整数。

注意,除了数字 0 本身之外,答案中的每个数字都不能有前导零(例如,01 是无效的,但 0 是有效的)。最后,请从小到大返回所有符合条件的整数。

示例1:

输入:n = 3 ,k = 7
输出:[181, 292, 707, 818, 929]

解释:

181 : 1 、8 、1的差值为k=7且长度为n=3

292 : 2 、9 、2的差值为k=7且长度为n=3 ....

示例2:

输入:n = 2 ,k = 1
输出:[10, 12, 21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 98]

解释: 10 : 1 、0的差值为k=1且长度为n=2

12 : 2 、9 、2的差值为k=1且长度为n=2

示例3:

输入:n = 4 ,k = 2
输出:[1313, 1353, 1357, 2020, 2024, 2420, 2424, 2464, 2468, 3131, 3135, 3531, 3535, 3575, 3579, 4202, 4242, 4246, 4642, 4646, 4686, 5313, 5353, 5357, 5753, 5757, 5797, 6420, 6424, 6464, 6468, 6864, 6868, 7531, 7535, 7575, 7579, 7975, 7979, 8642, 8646, 8686, 9753, 9757, 9797]`

解释:

1313 : 1 、3 、1、3的差值为k=2且长度为n=4

1353 : 1 、3 、5、3的差值为k=2且长度为n=4

解题思路

创建一个 ArrayList<Integer> 类型的 result 列表,用于存储最终符合条件的整数

通过一个 for 循环从 1 遍历到 9,针对每个起始数字(即个位数字)调用 backtrack 方法开始构建满足条件的数字

针对 n 等于 1 的特殊情况处理,如果 n 为 1,则将 0 添加到 result 列表中,这是考虑到当只需要生成一位数时, 0 也是一种可能的结果。

backtrack 方法

递归的回溯方法,用于构建满足条件的数字

终止条件判断,如果当前构建的数字位数 length 等于目标位数 n,说明已经构建好了一个满足位数要求的数字,将其添加到 result 列表中

递归过程中获取当前数字 current 的个位数 lastDigit(通过 %10 操作),然后基于这个个位数和差值 k 来尝试构建下一位数字,有两种情况:

  • 如果 lastDigit + k 的结果小于等于 9,则通过 current * 10 + (lastDigit + k) 构建一个新的数字,即将原数字乘以 10 (相当于左移一位)再加上新的个位数(lastDigit + k),然后递归调用 backtrack 方法,传入更新后的数字、目标位数 n、差值 k 以及位数加 1 的 length + 1,继续构建下一位数字。

  • 如果 k 不等于 0 且 lastDigit - k 的结果大于等于 0,同样按照上述类似的方式构建新数字(current * 10 + (lastDigit - k))并递归调用 backtrack 方法,继续探索这种构建路径下是否能生成满足条件的完整数字。

java代码
public static int[] solution(int n, int k) {
    // write code here
    List<Integer> result = new ArrayList<>();

    for (int i =1; i<=9 ; i++){
        backtrack(result, i ,n ,k ,1);
    }

    if (n == 1){
        result.add(0);
    }
    int[] ans = result.stream().mapToInt(i ->i).toArray();
    Arrays.sort(ans);
    return ans; // Placeholder return
}

public static void backtrack (List<Integer> result , int current , int n, int k, int length){
    if (length == n ){
        result.add(current);
        return;
    }

    int lastDigit = current %10 ;

    if ( lastDigit +k <=9) {
        backtrack(result, current *10+ (lastDigit + k), n, k, length+1);
    }
    if ( k!=0 && lastDigit -k >=0) {
        backtrack(result, current *10+ (lastDigit - k), n, k, length+1);
    }

}