剑指 Offer-44 数字序列中的某一位c++

------------------------------------2021/1/25二刷---------------------------------------
除了wNum都用long
-------------------------------------一刷------------------------------------------
第一次遇到找规律的题目
在这里插入图片描述

解法 找规律

首先要知道题目所谓 第5位(从下标0开始计数)是5 的意思,其实简单来看,因为数字从0 开始,所以第n位就是前面有n个数
显然,需要分成 0 - 9 10 - 99 100 - 999的段来分析
这里直接借用大佬的图
在这里插入图片描述
根据以上分析,可将求解分为三步:

确定 n 所在 数字 的 位数 ,记为 wNum ;
确定 n 所在的 数字 ,记为 num ;
确定 n 是 num 中的哪一数位,并返回结果。

主要有三个求解过程
1.位数计算

 while(n > count) {
        n -= count;
        wNum ++;
        begin *= 10;
        count = wNum * begin * 9;
    }

这里有个处理技巧,把0个位数的count设为 10,这样偏移量就刚好。
2.获得当前数字

cur = begin + n/wNum;

3.获得位数所对应的数值
在思考C++怎么得到num中从左往右第n位数的过程中,发现从11开始C++也有toString函数了。看来得去看看现在的C++到底进步成怎么样了。

 string s_num = to_string(cur);
 return int(s_num[tmp] - '0'); 

4.完整代码

class Solution {
public:
    int findNthDigit(int n) {
     //0-9之间 
    if(n <= 9) return n;
    //wNum : 位数     count :个数        
    int wNum = 1;
    long begin = 1;
    long count = 10;//设置0-9的count为十,这样第十个数字与10的偏移量就为0
    while(n > count) {
        n -= count;
        wNum ++;
        begin *= 10;
        count = wNum * begin * 9;
    }
    //第几个数      
    long cur = begin + n/wNum;
    //第几位
    int  tmp = n % wNum;
     // 将该数字转为 string 类型
    string s_num = to_string(cur);
    // n 对应着第 tmp位,再转成 int
    return int(s_num[tmp] - '0'); 
    }
};

在这里插入图片描述
时间复杂度O()
找规律的题目数字处理都比较困难,这题就磨了半天,还要继续努力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值