Leetcode 967:連續差相同的數字(超詳細的解法!!!)
阿新 • • 發佈:2019-01-09
返回所有長度為 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]
。然後我們就可以通過判斷,先將最高位的數新增到結果中去,判斷方式也非常簡單
接著通過同樣的方式去新增其他位的數字。最後還有個陷阱就是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
如有問題,希望大家指出!!!