题目描述

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

[牛客网刷题地址] 无

思路分析

  1. 数字位数为1时 ,共有10个1位数
  2. 数字位数为2时 ,共有9*10个2位数
  3. 数字位数为3时 ,共有9*(10^2)个3位数
  4. ...
  5. 数字位数为m时 ,共有9*(10^(m-1))个m位数

当给出序列号为index时,我们可以跳过比个数比index小的m位个数(要累加)。详见代码

测试用例

  1. 功能测试:输入10、190、 1000 等。
  2. 边界值测试:输入0、1等。

Java代码

public class Offer044 {
public static void main(String[] args) {
test1();
test2();
test3(); } public static int digitAtIndex(int index) {
return Solution1(index);
} private static int Solution1(int index) {
if(index<0) {
return -1;
}
int m=1; // m位数
while(true) {
int numbers = countOfIntegers(m);//得到m位数的个数
if(index<numbers*m) {//如果 序列号小于 m位数所占的位数
return getDigit(index,m);
}
index -= m*numbers;
m++;
}
} /**
* 得到m位数的个数
* m=1时 0~9 10个
* m=2时 10~99 9*10
* m=3时 100~999 9*(10^2)
* @param m
* @return
*/
private static int countOfIntegers(int m) {
if(m==1) {
return 10;
}
return (int) (9*Math.pow(10, m-1));
}
/**
* 获取数字
* @param index
* @param m
* @return
*/
private static int getDigit(int index, int m) {
int number = getFirstNumber(m)+index/m; //对应的m位数
int indexFromRight = m-index%m; //在数字中的位置
for(int i=1;i<indexFromRight;i++)
number/=10;
return number%10;
} /**
* m位数的首个数字
* m=1, 0
* m=2, 10
* m=3, 10^2
*
* @param m
* @return
*/
private static int getFirstNumber(int m) {
if(m==1)
return 0;
return (int) Math.pow(10,m-1);
} private static void test1() {
System.out.println(digitAtIndex(1000));
} private static void test2() {
System.out.println(digitAtIndex(0));
}
private static void test3() {
System.out.println(digitAtIndex(1));
}
}

代码链接

剑指Offer代码-Java

【Offer】[44] 【数字序列中某一位的数字】的更多相关文章

  1. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  2. 《剑指offer》第四十四题(数字序列中某一位的数字)

    // 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...

  3. 每日一题 - 剑指 Offer 44. 数字序列中某一位的数字

    题目信息 时间: 2019-07-01 题目链接:Leetcode tag: 规律 难易程度:中等 题目描述: 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个 ...

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

    题目描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位 ...

  5. 《剑指offer》面试题44. 数字序列中某一位的数字

    问题描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位 ...

  6. 剑指offer——46数字序列中某一位的数字

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

  7. 数字序列中某一位数字(《剑指offer》面试题44)

    由于这道题目在牛客上没有,所以在此记录一下. 一.题目大意: 数字以0123456789101112131415…的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数,即从第0位开始)是5 ...

  8. 剑指offer-面试题44-数字序列中某一位的数字-脑筋急转弯

    /* 题目: 数字以0123456789101112131415…的格式序列化到一个字符序列中. 在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等. 请写一个 ...

  9. CF628D Magic Numbers (数据大+数位dp)求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数

    题意:求[a,b]中,偶数位的数字都是d,其余为数字都不是d,且能被m整除的数的个数(这里的偶数位是的是从高位往低位数的偶数位).a,b<10^2000,m≤2000,0≤d≤9 a,b< ...

随机推荐

  1. WPF中如何禁用空格键(或其他键)

    在选择的控件中添加KeyDown event method private void OnKeyDown(object sender, KeyEventArgs e){ if (e.Key == Ke ...

  2. 夯实Java基础(十)——抽象类和接口

    转载自:http://cmsblogs.com/ 该博主的网站上干货非常!非常!非常多(说三遍),强烈推荐大家前去学习. 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法 抽象类与接口是 ...

  3. .net持续集成测试篇之Nunit参数化测试

    系列目录 在进行单元测试的时候,很多时候,很多时候我们都是在单元测试方法内部提供特定的值,但是这样测试往往造成样本数不足从而导致覆盖的结果不够全面,很多时候我们更想提供来自外部的,满足条件的一组值来进 ...

  4. npm包开发与发布

    把通用的功能开发成npm包,便用使用和维护,更重要的是可以分享给广大的开发者,是不是很激动人心! 那么,步骤如下: 1.创建项目 创建项目目录,npm init ,根据需要输入配置信息(建完后也可以在 ...

  5. MyBatis之#{} and ${}

    #{} 和 ${} 之间最大的差别就是  #{}会在使用的时候被加上 ‘’ 引号, ${}直接传值,不做任何处理 1.#{}对传入的参数会做预编译,也就是会当做字符串来处理 select * from ...

  6. java并发编程(十五)----(线程池)java线程池简介

    好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...

  7. AOSP 预置 APP

    Android 系统预置 APP 是做 Framework 应用开发经常经常会遇到的工作,预置 APP 分为两种,一种是直接预置 APK,一种是预置带有源码的 APP. 预置 apk 示例说明 以 . ...

  8. Simple Windows Service in C++

    本文是来自CodeProject中的一篇名为Simple Windows Service in C++的译文,原文地址为:https://www.codeproject.com/Articles/49 ...

  9. Tomcat源码分析 (六)----- Tomcat 启动过程(一)

    说到Tomcat的启动,我们都知道,我们每次需要运行tomcat/bin/startup.sh这个脚本,而这个脚本的内容到底是什么呢?我们来看看. 启动脚本 startup.sh 脚本 #!/bin/ ...

  10. macOS 下的 MySQL 8.0.17 安装与简易配置

    如果我写的这篇你看不懂,可能网上也没有你能看懂的教程了 虽然这篇针对的是8.0.x版本,但是关于MySQL配置之类的方法还是通用的 环境信息与适用范围 环境信息 环境/软件 版本 macOS macO ...