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);
}
}