题目
返回所有长度为 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];
当N>1时,首先确定如何来循环(举个栗子,如123,设1为第一位数):
- 循环第一位数:1~9
- 从第一位数开始循环依次得到后面的位数,这里确定循环位数 0 < n ≤ N − 1 0<n \leq N-1 0<n≤N−1,因为这里第一位数已经得到,所以只需得到后面 N − 1 N-1 N−1位数即可。
- 循环前一位数后面满足连续差K的数作为后一位数,通过第2步不断*10(因为是10进制数)得到最终符合题意的 N N N位数
class Solution:
def numsSameConsecDiff(self, N, K):
"""
:type N: int
:type K: int
:rtype: List[int]
"""
if N==1:
return(list(range(10)))
dic={}
for k in range(10):
dic[k]=[v for v in range(10) if abs(v-k)==K]
nums=[]
for f in range(10):
if f==0:
continue
tmp_nums=[f] #开始的那一位数
for n in range(N-1): #后面的N-1位数
k_nums=[]
while tmp_nums:
tmp_num=tmp_nums.pop(0)
k=tmp_num%10
values=dic[k]
for v in values:
k_