每日一题 【LeetCode400第 N 位数字】-二分查找法

LeetCode400 第 N 位数字 -二分查找法

  • 1:题目描述
  • 2:测试案例
  • 3:解题思路
  • 4:代码解析
  • 5:题目总结

1:题目描述

给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位数字。

2:测试案例

 测试案例1:

输入:n = 3
输出:3

 测试案例2:

输入:n = 11
输出:0
解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是 0 ,它是 10 的一部分。

提示:

1 <= n <= 2^31 - 1

3:解题思路

解释:返回第N位数,意思是把整数序列拼接,找到下标为【N-1】的整数,该整数是一位数(0-9),比如1 2 3 4 5 6 7 8 1 0 1 1 【10,11就是这么拆分】。
明白了题目的意思,接下来就是怎么解答这个题目
求解这个题,主要解决两个问题就可以:
1:找到n位是处于那个整数上的。
2:找到n位是出于这个整数的第几位。

4:代码解析

class Solution {
public:
    int findNthDigit(int n) {
   	//使用二分查找法进行解答
	//分析,由于n的限制。整数为数一定不会超过9位,以下整数【表示序列中的整数】
	auto alg = [](int len) 
	{
		int res = 0;
		while (len>0)
		{
			res += (len * (9 * pow(10, len - 1)));//计算几位数计算公式
			--len;
		}
		return res;
	};
	int low = 1, height = 9,mid =0;

	while (height> low)
	{
		mid = (low + height) / 2;
		//查找n位数的综合
		if (alg(mid) >= n)
			height = mid;
		else
			low = mid+1;
	}
	//能够定位整数
	int temp = alg(low-1); //计算出一位的总数
	//表示有几位 10  1表示第10位,0表示第11位
	n -= temp;//表示位数

	int index = (n +1)/low -1 ; //表示对应位数【整形是几位数】的 第几位整数

	int index1 = (low==1?0: pow(10, (low-1))) + index; //得出正确的整数,对1位数进行特殊考虑,因为从1开始
	int index2 = n % low; //算出位数
	string temp1 = to_string(index1);
	if (index2 == 0) //表示最后一位
	{
		return temp1[low - 1]-'0';
	};
	return temp1[index2 - 1] -'0';//前面low-1位
    }
};

5:题目总结

本篇文章参考着官方解法,进行思考和解析,自己使用的是直接计算的方法。
时间和空间复杂度都可以,但由于对二分法的使用不够熟悉,因此写了这篇文章记录二分查找法的使用场景。

你可能感兴趣的:(LeetCode,基础算法,算法,leetcode,二分查找)