当前位置: 首页 > news >正文

数字序列中某一位的数字 -- java

题目描述

数字以 0123456789101112131415…n (这是一个0~n排列)的格式序列化到一个字符序列中,在这个字符序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写出一个函数,求任意第n位对应的数字。

解题思路

以第1001位数字7为例

  • 步骤1:首先确定该数字是属于几位数的;
    如果是一位数,n<9;如果是两位数,n<10+90×2=190;如果是三位数,n<190+900×3=2890
    说明是n三位数。(这里有个循环)

  • 步骤2:确定该数字属于哪个数。100+(1001-190)/3= 370

  • 步骤3:确定是该数中哪一位。1001-190-(370-100)*3 = 1,所以位于“370”的下标为1的位置,即数字7

代码

public class DigitAtIndex {
    /**
     * 求出数字序列中某一位的数字
     * @param index
     * @return
     */
    public static int digitAtIndex(int index) {
        if (index < 0) {
            return -1;
        }

        int digits = 1;
        while(true) {
            int numbers = countOfIntegers(digits);
            if (index < numbers * digits) {
                return digitAtIndex(index, digits);
            }

            index -= digits * numbers;
            digits++;
        }
    }

    /**
     * 求出m位的数字的个数
     * @param digits
     * @return
     */
    public static int countOfIntegers(int digits) {
        if (digits == 1) {
            return 10;
        }

        int count = (int) Math.pow(10, digits-1);
        return count;
    }

    /**
     * 当我们知道要找的哪一位数字位于某m位数之中后,使用下面的函数找出那位数字
     * @param index
     * @param digits
     * @return
     */
    public static int digitAtIndex(int index, int digits) {
        int number = beginNumber(digits) + index / digits;
        int indexFromRight = digits - index % digits;
        for (int i = 1; i < indexFromRight; i++) {
            number /= 10;
        }
        return number % 10;
    }

    /**
     * 求出m位的第一个数字
     * @param digits
     * @return
     */
    public static int beginNumber(int digits) {
        if (digits == 1) {
            return 0;
        }

        return (int) Math.pow(10,digits-1);
    }

    public static void main(String[] args) {
        System.out.println(digitAtIndex(1001));
    }
}


来自:
《剑指Offer》
Coding-Interviews/数字序列中某一位的数字.md at master · todorex/Coding-Interviews

相关文章:

  • 把数组排成最小的数 -- java
  • 把数字翻译成字符串 -- java
  • jquery highlight高亮插件下载
  • 笔记本电脑彻底删除硬盘数据
  • win10安装跳过创建Microsoft账户
  • 解决 Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot b
  • springboot vue配置跨域访问
  • 解决 [WARNING]: Console output during zsh initialization detected.
  • 解决 vue ui 白屏
  • everything的安装后初始设置
  • Windows 安装vue配置
  • Could NOT find resource [logback-test.xml]
  • setSerializationInclusion(JsonInclude.Include.NON_NULL) 没有作用
  • mac查看电脑安装了多少个jdk
  • vue-cli-service: command not found
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 「译」Node.js Streams 基础
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android Volley源码解析
  • CSS 专业技巧
  • Docker: 容器互访的三种方式
  • ES6语法详解(一)
  • javascript 哈希表
  • MD5加密原理解析及OC版原理实现
  • Vim Clutch | 面向脚踏板编程……
  • windows-nginx-https-本地配置
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 翻译--Thinking in React
  • 浮现式设计
  • 理解在java “”i=i++;”所发生的事情
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 使用SAX解析XML
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • #Java第九次作业--输入输出流和文件操作
  • #pragma data_seg 共享数据区(转)
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • %check_box% in rails :coditions={:has_many , :through}
  • (3)STL算法之搜索
  • (二)Linux——Linux常用指令
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (正则)提取页面里的img标签
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .form文件_一篇文章学会文件上传
  • .NET 发展历程
  • .Net 路由处理厉害了
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)