zoukankan      html  css  js  c++  java
  • [leetCode]剑指 Offer 44. 数字序列中某一位的数字

    在这里插入图片描述

    解法

     直观解法是逐一枚举每个数字计算每个数字的数位和直到大于输入n,然后再从该数字中找出对应的那一位。
     更快的解法是我们可以把数字序列0,1,2,3...看成由不同位数数字组成的几部分序列0~9, 10 ~ 99,100 ~ 999.....输入n所在的数字存在于某个子序列中。可以通过计算每个序列所含位数来跳过这个序列。以n为1001为例
    0~9 一共10位小于1001,所以n一定在之后的序列中,可以跳过该序列 n - 10 = 991,10 ~99 有90个数字180位, 991 > 180 所以可以跳过,n = 991 - 180 = 881, 100 ~ 999 有900个数字 2700位, 881 < 2700,所以n位于3位数组成的序列中,此时881 = 270 * 3 +1,所以n位于从100开始后的270个数的第一位即370中的7。
    代码如下:

    class Solution {
        public int findNthDigit(int n) {
            if(n < 0) return -1;
            // 位数
            long digits = 1;
            while(true) {
                // 当前位数一共有多少位数字 
                long numbers = countOfIntegers(digits); 
                // digits * numbers 为数位数,会超过int最大值所以要用long
                if(n < numbers * digits)
                    return findNthDigit(n,digits);
                n -= digits * numbers;
                digits++;
            }
        }
    
        // 计算m位数字一共有多少个
        private long countOfIntegers(long digits) {
            if(digits == 1) 
                return 10L;
            long result = (long)Math.pow(10,digits -1);
            return (long)(result * 9);
        }
    
        private int findNthDigit(int n,long digits) {
            // number为n为数所在的数字
            long number = beginNumber(digits) + n / digits;
            long indexFromRight =digits -  n % digits;
            for(int i = 1; i < indexFromRight; ++i)
                number /= 10;
            return (int)(number % 10);
        }
    
        private long beginNumber(long digits){
            if(digits == 1)
                return 0;
            return (long)Math.pow(10,digits-1);
        }
    }
    
  • 相关阅读:
    小禾满月了
    Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了
    什么是CLI?
    什么是root帐户?
    Linux 的目录结构是怎样的?
    什么叫 CC 攻击?什么叫 DDOS 攻击?
    什么是 inode ?
    判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下?
    编写 Shell 程序,实现自动删除 50 个账号的功能,账号名为stud1 至 stud50 ?
    请问当用户反馈网站访问慢,如何处理?
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13859947.html
Copyright © 2011-2022 走看看