57. 数字序列中某一位的数字 (不懂)

算法1

以第15位数字1为例(1隶属与12,两位数,位于12从左侧以0号开始下标为0的位置)
步骤1:首先确定该数字是属于几位数的;
如果是一位数,n<9;如果是两位数,n<9+90X2=189;
说明是两位数。
因为是从0开始数数。0-9可以表示10个数字,从0开始数可以表示到9。10-99一共有90X2个数字,所以数到两位数能够数到9+90X2=189。
步骤2:确定该数字属于哪个数。10+(15-10)/2= 12。
步骤3:确定是该数中哪一位。15-10-(12-10)*2-1 = 0, 所以位于“12”的下标为0的位置,即数字1。

以第1001位数字7为例
步骤1:首先确定该数字是属于几位数的;
如果是一位数,n<9;如果是两位数,n<9+90X2=189;如果是三位数,n<189+900X3=2889;
说明是三位数。
步骤2:确定该数字属于哪个数。100+(1001-190)/3= 370。
步骤3:确定是该数中哪一位。1001-190-(370-100)X3-1 = 1,所以位于“370”的下标为1的位置,即数字7。

blablabla

时间复杂度分析:blablabla

作者:小纸条o--o
链接:https://www.acwing.com/solution/acwing/content/2043/

视频AcWing 57. 数字序列中某一位的数字

class Solution {
public:
    int digitAtIndex(int n) {
        //i表示是几位数,我们是从第一位(1~9)开始枚举的,s表示第i位数共有多少个(如第1位共有0~9个数),
        //base表示位数的起始值,(0~9起始值为1)。
         long long i = 1, s = 9, base = 1;
         while(n > i * s) {   // 9, 90, 900, 9000, 90000, i * s表示位数总共占多少位。
             n -= i * s;         // 1000 - 9 - 90 * 2 - 900 * 3 ,当i= 3 时不符合条件,说明是在三位数里面。
             i ++;
             s *= 10;
             base *= 10;
         }
         cout<< "n="<<n<<endl;
         int number = base + (n + i - 1) / i-1 ; //求位数的第几个数, 1000 - 9 - 180 = n , n / 3 + base - 1(考虑0故减1), (n/i)向上取整为(n + i - 1)/i。
         int r = n % i ? n % i : i;              // 除不尽就是第几位,除尽力了就是最后一位。
         for (int j = 0; j < i - r; j ++) number /= 10; //求数的第i - r位,取出第i - r位。

         return number % 10;

    }
};

原文地址:https://www.cnblogs.com/make-big-money/p/12322980.html

时间: 2024-10-08 19:19:27

57. 数字序列中某一位的数字 (不懂)的相关文章

剑指Offer对答如流系列 - 数字序列中某一位的数字

面试题44:数字序列中某一位的数字 题目描述 数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数求任意位对应的数字. 问题分析 这个寻求高效的解决方法,也是寻找规律: 个位数的个数一共有10个,即0~9,共占了10*1位数字:(特殊) 两位数的个数一共有90个,即10~99,每个数字占两位,共占了90*2位数字: -- m位数的个数一共有9*10^(m-1)个,每个数字占m位,

《剑指offer》第四十四题:数字序列中某一位的数字

// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一 // 个函数求任意位对应的数字. #include <iostream> #include <algorithm> using namespace std; int countOfIntegers(int digits); int digitAtIndex(

剑指offer:数字序列中某一位的数字

题目描述数字以0123456789101112131415-的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数,求任意第n位对应的数字. # -*- coding: utf-8 -*- # @Time : 2019-07-09 22:51 # @Author : Jayce Wong # @ProjectName : job # @FileName : digitAtIndex.py # @Blog : https://blog

数字序列中某一位的数字

数字按照0123456789101112131415161718192021-的顺序排列.第5位(从0开始计数)为5,第13位为1,第19位为4-- 求任意第n位对应的数字. 思路: 直观方法做枚举.每枚举一个数字的时候,求出该数字是几位数,并把数字的位数和前面的所有数字的位数相加.当累加的数位大于n时,那么第n位数字一定在这个数字里. 以第15位数字2为例(2隶属与12,两位数,位于12从左侧以0号开始下标为1的位置) 步骤1:首先确定该数字是属于几位数的; 如果是一位数,n<9;如果是两位数

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

/* 题目: 数字以0123456789101112131415…的格式序列化到一个字符序列中. 在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等. 请写一个函数,求任意第n位对应的数字. */ #include<iostream> #include<string.h> using namespace std; //自己实现pow,使用codeblocks中的pow,会转化为浮点数进行截断,得到的结果不准确. int pow(int num

得到一个数字中每一位的数字

学习编程也有一段时间了,随着学习的不断深入,我越来越体会到了算法的重要性,最近遇到了一些非常有意思的算法,比如打印水仙花数.将数字逆置,在这两个算法中会用到一个数字钟每一位的值 如:判断数字123是否是水仙花数需要得到每一位的数字 通常计算每一位的数字的算法是: 个位:a = 123 % 10 = 3 十位:b  = 123 %100 / 10 = 2 百位::c = 123 % 100 = 2 随着位数的越来越大,这种方法满足不了程序的需求 比如计算:123445677777777777777

笔试算法题(34):从数字序列中寻找仅出现一次的数字 &amp; 最大公约数(GCD)问题

出题:给定一个数字序列,其中每个数字最多出现两次,只有一个数字仅出现了一次,如何快速找出其中仅出现了一次的数字: 分析: 由于知道一个数字异或操作它本身(X^X=0)都为0,而任何数字异或操作0都为它本身,所以当所有的数字序列都异或操作之后,所有出现两次的数字异或操作之后的结果都为0,则最后剩下的结果就是那个仅出现了一次的数字: 如果有多个数字都仅仅出现了一次,则上述的异或操作方法不再适用:如果确定只有两个数字只出现了一次,则可以利用X+Y=a和XY=b求解: 解题: 1 int findSin

PHP数字格式化,每三位逗号分隔数字,可以保留小数

在报价的时候为了给浏览者更清晰明确的数字,所以需要用到数字格式化,有两种方法,一种自己写函数,另一种当然是系统自带的,其实我更喜欢系统自带的. 先来系统简单的: string number_format ( float number [, int decimals [, string dec_point, string thousands_sep]] ): 示例代码 echo number_format('169856420'); 输出结果将为: 169,856,420 示例代码 echo nu

数字图像处理------中值滤波

一 中值滤波概念 中值滤波算法以某像素的领域图像区域中的像素值的排序为基础,将像素领域内灰度的中值代替该像素的值[1]: 如:以3*3的领域为例求中值滤波中像素5的值 图1 1)int pixel[9]中存储像素1,像素2...像素9的值: 2)对数组pixel[9]进行排序操作: 3)像素5的值即为数组pixel[9]的中值pixel[4]. 中值滤波对处理椒盐噪声非常有效. 二 中值滤波代码实现 项目工程:https://github.com/ranjiewwen/Everyday_Prac