leetcode 247
问题
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.
Example:
1 2
| Input: n = 2 Output: ["11","69","88","96"]
|
分析
思路1:先考虑n位数的前n/2位,然后在通过前n/2位生成后n/2。注意corner case,n为奇数的情况下这n位数的最中间的一位只能取到’0’, ‘1’, ‘8’三种情况,以及在考虑前n/2时,第一位应该从’1’开始取,其他位从’0’开始取。
思路2:采用确定中间进行两边扩展的方式,递归地进行处理。注意corner case,n为奇数和n为偶数,以及要不要首位添加’0’的判断。
代码1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { public: char a[5] = {'0', '1', '6', '8', '9'}; vector<string> findStrobogrammatic(int n) { vector<string> ans; int suffixNum = n/2; bool odd = (n%2)==1? true: false; string s; dfs(ans, s, suffixNum, odd); return ans; } void dfs(vector<string> &ans, string &s, int suffixNum, bool odd) { if (s.size() == suffixNum) { string rs = getMirror(s); if (odd) { ans.push_back(s + "0" + rs); ans.push_back(s + "1" + rs); ans.push_back(s + "8" + rs); } else { ans.push_back(s+rs); } } else { int startIndex = s.size() == 0? 1: 0; for (int i = startIndex; i < 5; ++i) { s += a[i]; dfs(ans, s, suffixNum, odd); s.pop_back(); } } }
string getMirror(const string &s) { string ret; for (int i = s.size()-1; i>=0; --i) { char c; switch (s[i]) { case '0': c = '0'; break; case '1': c = '1'; break; case '6': c = '9'; break; case '8': c = '8'; break; case '9': c = '6'; break; default: break; } ret += c; } return ret; } };
|
代码2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: vector<string> findStrobogrammatic(int n) { return helper(n, n); } vector<string> helper(int n, int m) { if (n == 0) return {""}; if (n == 1) return {"0", "1", "8"}; vector<string> number = helper(n-2, m); vector<string> ret; for (string &s: number) { if (n != m) ret.push_back('0' + s + '0'); ret.push_back('1'+s+'1'); ret.push_back('6'+s+'9'); ret.push_back('8'+s+'8'); ret.push_back('9'+s+'6'); } return ret; } };
|