返回所有长度为 N
且满足其每两个连续位上的数字之间的差的绝对值为 K
的非负整数。
请注意,除了数字 0
本身之外,答案中的每个数字都不能有前导零。例如,01
因为有一个前导零,所以是无效的;但 0
是有效的。
你可以按任何顺序返回答案。
示例 1:
输入:N = 3, K = 7
输出:[181,292,707,818,929]
解释:注意,070 不是一个有效的数字,因为它有前导零。
示例 2:
输入:N = 2, K = 1
输出:[10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]
提示:
1 <= N <= 9
0 <= K <= 9
解题思路
这个问题非常简单,直接按照题目意思来就可以,不过有几个陷阱需要注意。首先我们知道当N==1
的时候,无论K
是多少,我们返回的结果都是[0,1,2,3,4,5,6,7,8,9]
。然后我们就可以通过判断,先将最高位的数添加到结果中去,判断方式也非常简单
- i + K < 10 i+K<10 i+K<10
- i + K > = 0 i+K>=0 i+K>=0
接着通过同样的方式去添加其他位的数字。最后还有个陷阱就是K=0
,对于这种情况,我们要避免重复添加元素(因为我们是通过i+K
和i-K
去添加元素的),最简单的方式就是通过set
。
class Solution:
def numsSameConsecDiff(self, N, K):
"""
:type N: int
:type K: int
:rtype: List[int]
"""
if N == 1:
return list(range(10))
res = list()
for i in range(1, 10):
if i + K < 10 or i - K >= 0:
res.append(i)
for i in range(1, N):
tmp_res = list()
while res:
num = res.pop(0)
num_s = num % 10
if num_s + K < 10:
tmp_res.append(num*10 + num_s + K)
if num_s - K >= 0:
tmp_res.append(num*10 + num_s - K)
res = tmp_res
return list(set(res))
更加简洁的写法。
class Solution:
def numsSameConsecDiff(self, N, K):
"""
:type N: int
:type K: int
:rtype: List[int]
"""
if N == 1:
return list(range(10))
res = list(range(1, 10))
for _ in range(1, N):
tmp_res = list()
for num in res:
num_s = num % 10
for i in {num_s - K, num_s + K}:
if 0 <= i <= 9:
tmp_res.append(num * 10 + i)
res = tmp_res
return res
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!