1. 程式人生 > >Leetcode 967:連續差相同的數字(超詳細的解法!!!)

Leetcode 967:連續差相同的數字(超詳細的解法!!!)

返回所有長度為 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. 1 <= N <= 9
  2. 0 <= K <= 9

解題思路

這個問題非常簡單,直接按照題目意思來就可以,不過有幾個陷阱需要注意。首先我們知道當N==1的時候,無論K是多少,我們返回的結果都是[0,1,2,3,4,5,6,7,8,9]。然後我們就可以通過判斷,先將最高位的數新增到結果中去,判斷方式也非常簡單

  • i + K &lt;
    10 i+K&lt;10
  • i + K &gt; = 0
    i+K&gt;=0

接著通過同樣的方式去新增其他位的數字。最後還有個陷阱就是K=0,對於這種情況,我們要避免重複新增元素(因為我們是通過i+Ki-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

如有問題,希望大家指出!!!