《剑指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. 数字序列中某一位的数字

LeetCode(剑指 Offer)- 44. 数字序列中某一位的数字

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

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

剑指offer刷题- 数字序列中某一位的数字

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