Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
1、题目描述
给定一个整数 n ,返回所有长度为 n 的 中心对称数 。你可以以 任何顺序 返回答案。
中心对称数 是一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。
示例 1:
输入:n = 2
输出:["11","69","88","96"]
示例 2:
输入:n = 1
输出:["0","1","8"]
提示:
1 <= n <= 14
2、思路分析
首先我们应该先确认一下有哪些数字可以用来构成中心对称数。
通过上图我们可以发现有这么3个数字翻转后和本身还是一样的,分别是0、1和8,但是仔细观察,我们还发现6和9互为对方翻转后的数字,所以我们应该把6和9也考虑进去,但是我们要注意几点:
- (1)0不能作为前置0出现
if(i == 0 && key == 0 && n != 1) continue; - (2)6和9必须同时出现
if(i == len - 1 && (key == 6 || key == 9) && n % 2 == 1) continue;
有了上面的分析之后我们也就可以开始尝试解题了,我们可以进行一下几个步骤:
- (1)定义翻转数字哈希表
const numMap = {
0:0,
1:1,
6:9,
8:8,
9:6
};
- (2)将数组分成两部分来组成(与回文串类似) 前半部分长度为
let len = Math.ceil(n / 2);
- (3)递归构建字符串
let dfs = function(str = '',i = 0){
if(i === len){
let append = '';
let l = len;
if(n % 2 == 1) l--;
for(let ind = 0; ind < l; ind++){
append = numMap[str[ind]] + append;
}
res.push(str + append);
return;
}
for(let key in numMap){
if(i == 0 && key == 0 && n != 1) continue;
if(i == len - 1 && (key == 6 || key == 9) && n % 2 == 1) continue;
dfs(str + key, i + 1);
}
}
3、AC代码
/**
* @param {number} n
* @return {string[]}
*/
var findStrobogrammatic = function(n) {
const numMap = {
0:0,
1:1,
6:9,
8:8,
9:6
};
let res = [];
let len = Math.ceil(n / 2);
let dfs = function(str = '',i = 0){
if(i === len){
let append = '';
let l = len;
if(n % 2 == 1) l--;
for(let ind = 0; ind < l; ind++){
append = numMap[str[ind]] + append;
}
res.push(str + append);
return;
}
for(let key in numMap){
if(i == 0 && key == 0 && n != 1) continue;
if(i == len - 1 && (key == 6 || key == 9) && n % 2 == 1) continue;
dfs(str + key, i + 1);
}
}
dfs('',0);
return res;
};