中心对称数 II

139 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

1、题目描述

给定一个整数 n ,返回所有长度为 n 的 中心对称数 。你可以以 任何顺序 返回答案。
中心对称数 是一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。

示例 1:

输入:n = 2
输出:["11","69","88","96"]

示例 2:

输入:n = 1
输出:["0","1","8"]

提示:

1 <= n <= 14

2、思路分析

首先我们应该先确认一下有哪些数字可以用来构成中心对称数。

image.png 通过上图我们可以发现有这么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;
};