zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 400 第N个数字

    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;
        }
    }
    
  • 相关阅读:
    Service(服务)简单使用
    Android设计模式——抽象工厂方法模式
    Android设计模式——工厂方法模式
    算法问题——递归算法
    Android设计模式——Builder(建造者)模式
    Android设计模式——单例模式
    蓝牙4.0权限问题
    Android 网络状态变化的监听
    RecyclerView的使用
    函数参数的引用传递与值传递
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13075120.html
Copyright © 2011-2022 走看看