[Leetcode] 247. Strobogrammatic Number II

经过一番考虑,从这题开始暂时不更新我自己认为太简单的题目的博客,为了争取时间。

简单描述一下这个strobogrammatic number转180度的意义,其实就是建立一个表格
1对应1,6对应9(=_=),8对应8,9对应6,0对应0。
所以一个完整的strobogrammatic数字就是第一个数字对应的数字和倒数第一个数字相等,第二个对应的和倒数第二个相等,第三个对应的和倒数第三个相等...如此类推。
所以这一题要列举出来全部,其实就有点类似于穷举递归排列。每个位置是一个递归层,递归到长度的一半就结束(因为另一半就是它表格里对应的数字),这个时候你就会发现一个情况,如果n是一个奇数,那么砍了一半之后会多出来一个中间的数字,那个就需要自对应,也就是表格里对应的数字等于自己的:1,8,0。另外还有一个情况,那就是首字母不能为0,否则就没有意义了。因为没有一个合理的数字是0开头的。。007么?=。=
所以基本就是一个穷举递归外加处理两个特殊情况。给出代码如下:

    public List<String> findStrobogrammatic(int n) {
        Map<Character, Character> diffMap = new HashMap<>();
        char[] selfArr = new char[]{'0', '1', '8'};
        diffMap.put('6', '9');
        diffMap.put('9', '6');
        List<String> result = new LinkedList<String>();
        buildResult(0, n, new char[n], selfArr, diffMap, result);
        return result;
    }
    
    private void buildResult(
        int curPos,
        int n,
        char[] cache,
        char[] selfArr,
        Map<Character, Character> diffMap,
        List<String> result
    ) 
    {
        if (curPos < (n + 1) / 2) {
            for (char c : selfArr) {
                if (curPos == 0 && c == '0' && n != 1) continue;
                cache[curPos] = cache[n - 1 - curPos] = c;
                buildResult(curPos + 1, n, cache, selfArr, diffMap, result);
            }

            if (n % 2 == 0 || curPos != n / 2) {
                for (char c : diffMap.keySet()) {
                    cache[curPos] = c;
                    cache[n - 1 - curPos] = diffMap.get(c);
                    buildResult(curPos + 1, n, cache, selfArr, diffMap, result);
                }
            }
        } else if (n != 0) {
            result.add(new String(cache));
        }
    }

写代码的过程里面自己打了自己脸,确实有数字是可以以0开头的。那就是0自己。。。所以if(curPos == 0 && c == '0')这个判断后面又加了一个n != 1。。。

猜你喜欢

转载自blog.csdn.net/chaochen1407/article/details/81203509