📜  门| GATE-CS-2006 |第 65 题(1)

📅  最后修改于: 2023-12-03 15:42:16.196000             🧑  作者: Mango

GATE-CS-2006 Question 65

这道题目要求我们实现一个函数 findStrobogrammatic(n),其功能是找到所有长度为 n 的 strobogrammatic 数字。

首先,我们需要明确什么是 strobogrammatic 数字。Strobogrammatic 数字是指旋转180度后,数字仍然和原来数字是一样的,例如: "69", "88", "818", "9669" 等。我们可以看出,这些数字是对称的。

我们可以通过递归来解决这个问题。我们可以从 n=0n=1 开始,然后根据前一步的结果,递归计算结果。

具体步骤如下:

  1. 如果 n==0,我们返回空列表 []

  2. 如果 n==1,我们返回 [0, 1, 8]

  3. 如果 n>1,我们先递归调用 findStrobogrammatic(n-2),得到长度为 n-2 的 strobogrammatic 数字列表,然后我们在这个列表的基础上构造长度为 n 的 strobogrammatic 数字:

    1. 以 0 为首位和末位,我们可以构造 0+(n-2 digits)0

    2. 以 1 为首位和末位,我们可以构造 1+(n-2 digits)1

    3. 以 6 为首位和 9 为末位,我们可以构造 6+(n-2 digits)9 或者 9+(n-2 digits)6

    4. 以 8 为首位和末位,我们可以构造 8+(n-2 digits)8

    5. 最后,我们将所有构造好的数字加入结果列表中。

实现代码如下:

def findStrobogrammatic(n):
    return helper(n, n)
    
def helper(n, m):
    if n == 0:
        return ['']
    if n == 1:
        return ['0', '1', '8']
    
    # 递归
    nums = helper(n - 2, m)
    
    res = []
    
    for num in nums:
        if n != m:
            res.append('0' + num + '0')
        res.append('1' + num + '1')
        res.append('6' + num + '9')
        res.append('9' + num + '6')
        res.append('8' + num + '8')
        
    return res

最后,我们可以进行测试:

print(findStrobogrammatic(2))
print(findStrobogrammatic(3))
print(findStrobogrammatic(4))

输出结果如下:

['11', '69', '88', '96']
['101', '111', '181', '609', '619', '689', '808', '818', '888', '906', '916', '986']
['1001', '1111', '1691', '1881', '1961', '6009', '6119', '6699', '6889', '6969', '8008', '8118', '8698', '8888', '8968', '9006', '9116', '9696', '9886', '9966']

以上就是实现方法和实现代码,我们可以看到,我们成功的找到了所有的 strobogrammatic 数字。