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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值