​LeetCode刷题实战248:中心对称数III

共 3824字,需浏览 8分钟

 ·

2021-04-28 13:22

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 中心对称数III,我们先来看题面:
https://leetcode-cn.com/problems/strobogrammatic-number-iii/

A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down).


Write a function to count the total strobogrammatic numbers that exist in the range of low <= num <= high.

中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。
写一个函数来计算范围在 [low, high] 之间中心对称数的个数。

示例


示例:
输入: low = “50”, high = “100”
输出: 3
解释: 69,88 和 96 是三个在该范围内的中心对称数


解题

主要思路:

(1)仔细观察中心对称数的规律,若中心对称数的位数是偶数,则可以由{0,0}{1,1}{6,9}{9,6}{8,8}从数字的两端对称组成,若中心对称数的位数是奇数,则中心数字只能是0,1,8三种数字;

(2)根据上述的分析,可以从空字符串,或“1”,“0”,“8”开始,在字符串的两端对应的添加数字对,来实现中心对称数的构成;

(3)在构造中心对称数的过程中,和low,high比较,保证生成的中心对称数是有效的;

class Solution {
public:
  //使用深度优先构造中心对称数
    void dfs(string& low,string& high,int& count,string cur){
        if(cur.size()>=low.size()&&cur.size()<=high.size()){//若当前的中心对称数在有效范围之内
          //三种当前的中心对称数是无效的情形
          //第一种是当前的中心对称数的长度符合要求,但大于最大值
          //第二种是当前的中心对称数的长度符合要求,但小于最小值
          //第三种是当前的中心对称数的长度大于1,但最高位是0的情形
          //若非这三种情形,则说明当前的中心对称数是有效的数,统计数量加1
            if(!(cur.size()==high.size()&&cur>high
            ||cur.size()==low.size()&&cur<low
            ||cur.size()>=2&&cur[0]=='0')){
                ++count;
            }
        }
        //若长度越界,则返回
        if(cur.size()+2>high.size()){
            return;
        }
        //几种从当前情形生成新的中心对称数的方式
        dfs(low,high,count,"0"+cur+"0");
        dfs(low,high,count,"1"+cur+"1");
        dfs(low,high,count,"6"+cur+"9");
        dfs(low,high,count,"9"+cur+"6");
        dfs(low,high,count,"8"+cur+"8");
    }
    int strobogrammaticInRange(string low, string high) {
        int count=0;//统计中心对称数的个数
        //几种中心对称数的可能的初始情形
        dfs(low,high,count,"");
        dfs(low,high,count,"1");
        dfs(low,high,count,"0");
        dfs(low,high,count,"8");
        return count;
    }
};


好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-240题汇总,希望对你有点帮助!
LeetCode刷题实战241:为运算表达式设计优先级
LeetCode刷题实战242:有效的字母异位词
LeetCode刷题实战243:最短单词距离
LeetCode刷题实战244:最短单词距离 II
LeetCode刷题实战245:最短单词距离 III
LeetCode刷题实战246:中心对称数
LeetCode刷题实战247:中心对称数II

浏览 140
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报