📅  最后修改于: 2023-12-03 15:42:16.196000             🧑  作者: Mango
这道题目要求我们实现一个函数 findStrobogrammatic(n)
,其功能是找到所有长度为 n
的 strobogrammatic 数字。
首先,我们需要明确什么是 strobogrammatic 数字。Strobogrammatic 数字是指旋转180度后,数字仍然和原来数字是一样的,例如: "69", "88", "818", "9669" 等。我们可以看出,这些数字是对称的。
我们可以通过递归来解决这个问题。我们可以从 n=0
和 n=1
开始,然后根据前一步的结果,递归计算结果。
具体步骤如下:
如果 n==0
,我们返回空列表 []
。
如果 n==1
,我们返回 [0, 1, 8]
。
如果 n>1
,我们先递归调用 findStrobogrammatic(n-2)
,得到长度为 n-2
的 strobogrammatic 数字列表,然后我们在这个列表的基础上构造长度为 n
的 strobogrammatic 数字:
以 0 为首位和末位,我们可以构造 0
+(n-2 digits)0
。
以 1 为首位和末位,我们可以构造 1
+(n-2 digits)1
。
以 6 为首位和 9 为末位,我们可以构造 6
+(n-2 digits)9
或者 9
+(n-2 digits)6
。
以 8 为首位和末位,我们可以构造 8
+(n-2 digits)8
。
最后,我们将所有构造好的数字加入结果列表中。
实现代码如下:
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 数字。