剑指 Offer 44. 数字序列中某一位的数字

题目链接:leetcode.

我能做的。。。

class Solution {
public:
    int findNthDigit(int n) {
        if(n < 10)
        	return n;
        
    }
};

看了大佬题解后:

  • 先求出n是在几位数表示范围内

    • 1位数9个 以1开头 共占9位
    • 2位数90个 以10开头 共占180位
    • 3位数900个 以100开头 共占2700位
    • … …
  • 再算出n对应的是该范围内的哪一个数字num

  • 再算出是数字num中的哪一位

/*
37 / 70 个通过测试用例 	1000000000溢出
countt和start改为long型
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了95.63%的用户 
*/
class Solution {
public:
    int findNthDigit(int n) {
        if(n == 0)
        	return n;
        int start = 1;
		long digit = 1, countt = 9;
        //n落在digit位数范围内 
		while(n > countt)
		{
			n -= countt;
			digit++;
			start *= 10;
			countt = 9 * start * digit; 
		} 
		//n对应的num是几
		int num = start + (n - 1) / digit;
		//n对应num的第几位
		int tmp = (n - 1) % digit;
		for(int i = digit - 1;i > tmp;--i)
		{
			num /= 10;
		} 
		return num % 10;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值