《剑指Offer——数字序列中某一位的数字》代码
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——数字序列中某一位的数字》代码相关的知识,希望对你有一定的参考价值。
数字序列中某一位的数字
前言
//==================================================================
// 《剑指Offer——数字序列中某一位的数字》代码
// 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这
// 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一
// 个函数求任意位对应的数字。
//==================================================================
一、示例
1.数字序列中某一位的数字
/*=========================================================
数字以0123456789101112131415…的格式序列化到一个字符序列中。
在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
==========================================================*/
二、代码解析
1.新建.cpp文件
代码如下(示例):
//==================================================================
// 《剑指Offer——数字序列中某一位的数字》代码
// 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这
// 个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一
// 个函数求任意位对应的数字。
//==================================================================
#include <iostream>
using namespace std;
/*=========================================================
数字以0123456789101112131415…的格式序列化到一个字符序列中。
在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。
请写一个函数,求任意第n位对应的数字
示例 1:
输入:n = 3
输出:3
示例 2:
输入:n = 11
输出:0
==========================================================*/
/*法一----暴力解法*/
int digits(int num)
{
if (num == 0)return 1;
int digit = 0;
while (num != 0)
{
num /= 10;
digit += 1;
}
return digit;
}
int findDigit(int num, int i)
{
int number = num;
for (int j = 0; j < i; ++j)
{
number /= 10;
}
return number % 10;
}
int findNthDigit(int n)
{
if (n <= 0)return 0;
int len = 0;
for (int i = 1; i <= n; ++i)
{
len += digits(i);
if (len >= n)
{
return findDigit(i, len - n);
}
}
return 0;
}
/*法二---跳跃法*/
//得到m位数的第一个数字
int beginNumber(int digits)
{
if (digits == 1)return 0;
return (int)pow(10, digits - 1);
}
//得到当前数字的第几位数字
int digitAtIndex(int index, int digits)
{
int number = beginNumber(digits) + index / digits;
int indexFormRight = digits - index % digits;
for (int i = 1; i < indexFormRight; ++i)
{
number /= 10;
}
return number % 10;
}
//得到m位数的数字总共有多少
int countOfIntegers(int digits)
{
if (digits == 1)return 10;
int count = (int)pow(10, digits - 1);
return 9 * count;
}
int digitAtIndex(int n)
{
long index = n;
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++;
}
return -1;
}
int main()
{
cout << "法一--暴力解法---->" << findNthDigit(1001) << endl;
cout << "法一--二分法---->" << digitAtIndex(1000000000) << endl;
return 0;
}
三,测试
以上是关于《剑指Offer——数字序列中某一位的数字》代码的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode(剑指 Offer)- 44. 数字序列中某一位的数字