[LeetCode] Strobogrammatic Number II 對稱數之二
A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).
Find all strobogrammatic numbers that are of length = n.
For example,
Given n = 2, return ["11","69","88","96"]
.
Hint:
- Try to use recursion and notice that it should recurse with n - 2 instead of n
這道題是之前那道Strobogrammatic Number的拓展,那道題讓我們判斷一個數是否是對稱數,而這道題讓我們找出長度為n的所有的對稱數,我們肯定不能一個數一個數的來判斷,那樣太不高效了,而且OJ肯定也不會答應。題目中給了提示說可以用遞迴來做,而且提示了遞迴呼叫n-2,而不是n-1。我們先來列舉一下n為0,1,2,3,4的情況:
n = 0: none
n = 1: 0, 1, 8
n = 2: 11, 69, 88, 96
n = 3: 101, 609, 808, 906, 111, 619, 818, 916, 181, 689, 888, 986
n = 4: 1001, 6009, 8008, 9006, 1111, 6119, 8118, 9116, 1691, 6699, 8698, 9696, 1881, 6889, 8888, 9886, 1961, 6969, 8968, 9966
我們注意觀察n=0和n=2,可以發現後者是在前者的基礎上,每個數字的左右增加了[1 1], [6 9], [8 8], [9 6],看n=1和n=3更加明顯,在0的左右增加[1 1],變成了101, 在0的左右增加[6 9],變成了609, 在0的左右增加[8 8],變成了808, 在0的左右增加[9 6],變成了906, 然後在分別在1和8的左右兩邊加那四組數,我們實際上是從m=0層開始,一層一層往上加的,需要注意的是當加到了n層的時候,左右兩邊不能加[0 0],因為0不能出現在兩位數及多位數的開頭,在中間遞迴的過程中,需要有在數字左右兩邊各加上0的那種情況,參見程式碼如下:
解法一:
class Solution { public: vector<string> findStrobogrammatic(int n) { return find(n, n); } vector<string> find(int m, int n) { if (m == 0) return {""}; if (m == 1) return {"0", "1", "8"}; vector<string> t = find(m - 2, n), res; for (auto a : t) { if (m != n) res.push_back("0" + a + "0"); res.push_back("1" + a + "1"); res.push_back("6" + a + "9"); res.push_back("8" + a + "8"); res.push_back("9" + a + "6"); } return res; } };
這道題還有迭代的解法,感覺也相當的巧妙,需要從奇偶來考慮,奇數賦為0,1,8,偶數賦為空,如果是奇數,就從i=3開始搭建,因為計算i=3需要i=1,而我們已經初始化了i=1的情況,如果是偶數,我們從i=2開始搭建,我們也已經初始化了i=0的情況,所以我們可以用for迴圈來搭建到i=n的情況,思路和遞迴一樣,寫法不同而已,參見程式碼如下:
解法二:
class Solution { public: vector<string> findStrobogrammatic(int n) { vector<string> one{"0", "1", "8"}, two{""}, res = two; if (n % 2 == 1) res = one; for (int i = (n % 2) + 2; i <= n; i += 2) { vector<string> t; for (auto a : res) { if (i != n) t.push_back("0" + a + "0"); t.push_back("1" + a + "1"); t.push_back("6" + a + "9"); t.push_back("8" + a + "8"); t.push_back("9" + a + "6"); } res = t; } return res; } };
類似題目:
參考資料: