400. 第N个数字

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。

注意:

n 是正数且在32为整形范围内 ( n < 231)。

示例 1:

输入:

3

输出:

3

示例 2:

输入:

11

输出:

0

说明:

第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是0,它是10的一部分。

PS:

思路是:位数 数字个数(即个位数字一共9个 两位数一共90个)

1 9

2 90

3 900

… …

给定一个n,先找所在的区间(如1-9,10-99…),然后求出它是所在的区间的第多少个数字,再算出是这个数字的第几位。找区间按照公式n=n-9*1-90*2-900*3...-9*10^(i-1)*i,

求出的i指它在i位数的区间内,n为该区间第n个数字,假设公式得到的n=4,i=2,那么说明是两位数,4/i=2,说明是第2个数字,即11,4%i=0,说明是第二个数字的最后一位,即1。

再假设共识得到n=25,i=3,说明是三位数,25/3=8,25%3=1,说明三位数中第8+1个数字,是这个数字的第1位,即是108中的1


class Solution {
public int findNthDigit(int n) {
if(n<10) return n;
int i;//记录结果所在数字的区间是几位数
for(i=1;n>9*i*Math.pow(10,i-1);++i){
n-=9*i*Math.pow(10,i-1);
}
int index=n/i;//某个区间第index个数字
if(index==0) index=1;//不会出现第0个数字,起码从第一个数字起
int bit=n%i;//第index个数的第bit位,接下来找出这个位数
int number=(int)Math.pow(10,i-1)+index-1; //number为一个具体的i位数
if(bit==0)//说明在这个数字的最后一位
return number%10;
else return getIndexBit(number+1,bit,i);//bit不为0 时,数字要再加1
}
private int getIndexBit(int number,int bit,int i){ //获取数字number的第bit位数
int a=(int)(number/Math.pow(10,i-bit));
return a%10;
}
}

最新文章

  1. MySQL高可用架构之MHA
  2. Tableau修改参考线上显示的标签
  3. 慕课网-Java入门第一季-7-1 如何定义 Java 中的方法
  4. sqlite的增删改查
  5. echosp 销量排行 新增实际价格
  6. Linux考试易忘命令
  7. 贪心 POJ 1328 Radar Installation
  8. Spark菜鸟学习营Day4 单元测试程序的编写
  9. cxf简单实例
  10. PCB优化设计(二) 转载
  11. js兼容性大全(持续更新)
  12. Flask web开发 简单介绍
  13. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据
  14. ubuntu 18.04安装docker以及docker内配置neo4j
  15. 如何创建应用程序包(C ++)
  16. HTML表单简单练习
  17. html5-article元素
  18. hdu 1000 真水题
  19. tomcat修改java不重启
  20. MSP430 G2553 Launchpad实现电容测量

热门文章

  1. CF#633 D. Edge Weight Assignment
  2. PROTEUS串口仿真遇到的BUG(转载)
  3. [java作业]Fan、求直线交点、Triangle2D、选课
  4. [hdu5266]区间LCA
  5. 使用windows(win7和win10),最好用chocolatey
  6. vue父子组件之间相互传值
  7. HTML5 Canvas绘图如何使用
  8. form和table的区别
  9. Spring @Qualifier 注释
  10. CukeTest+Puppeteer的Web自动化测试(二)