剑指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,int digits){

    int res = 1;
    for(int i = 0; i < digits; i++){
        res *= num;
    }
    return res;
}
/*
解法一:
	一个数字一个数字遍历,当数字位数之和超过n,则所需数字在遍历到的最后一个数字。
*/
int NumberOfSequence1(int n){
    if(n < 0) return -1;
    int currNumber = 0;
    int myCount = 0;
    while(myCount <= n){
        myCount += to_string(currNumber).size();
        currNumber++;
    }
    return to_string(currNumber-1)[n-myCount+to_string(currNumber-1).size()] -‘0‘;
}

/*
解法二:
	0~9中有10个数,10~99有2*90=180个数,100~999有3*900=2700个数
	例1001,可以有10+180<1001 && 10+180+2700>1001,所以要找的数在100~999中
	1001-10-180=881,881/3=270,881%3=1,所以要找的数在100+270=370中
	其中截止到369有810个数字,3为第811个数字,7为第812个数字,0为813个数字
	从0开始计数,则7为811位数字。
*/
int NumberOfSequence2(int n){
    if(n < 0) return -1;
    if(n < 9) return n;

    int myCount = 10;
    int i = 2;
    while(myCount <= n){
        myCount = myCount + (int)i*9*pow(10,i-1);
        i++;
    }
    int temp = n - (myCount - (i-1)*9*pow(10,i-2));
    int res_index= temp%(i-1);
    int res_val = (temp / (i - 1) + pow(10,i-2));

    return to_string(res_val)[res_index] - ‘0‘;
}

int main(){
    cout<<NumberOfSequence2(1500000)<<endl;
    cout<<NumberOfSequence1(1500000)<<endl;
}

  

原文地址:https://www.cnblogs.com/buaaZhhx/p/12019287.html

时间: 2024-10-08 19:12:55

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

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

剑指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 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

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, 所以位于

剑指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

剑指Offer 面试题40:数组中只出现一次的两个数 题解

面试题40:数组中只出现一次的两个数 提交网址:  http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193 或 http://ac.jobdu.com/problem.php?pid=1351 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 牛客网OJ的输入输出接口是:void Fin

【剑指offer】十九,数组中出现次数超过一半的数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 分析:找数组中出现次数超过一半的数字,我们一半可以采用两种方法,一是使用快排,对数组进行排序,然后直接输出排序数组中间位置的数.第二种是使用HashMap<Integer,Integer>,key是数组中的数字,value为其在数组中出现的次数,顺序扫描数组,记录下数组出现的次数,输出大于数组长

剑指offer——面试题29:数组中出现次数超过一半的数

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 解法一:基