数字序列中某一位的数字(Leetcode 剑指Offer44)

1

题目分析

   这个题目应该和43题一起做,都是经典的找规律的题目,这个题目相比上一题简单一些,小伙伴们开动脑筋想一想。

数学规律

我们一般按照位数进行找规律,0-9一位数中,每个数字只有一个字符,共10个字符。而10-99中,这90个两位数中,每个数字都有2个字符,共180个字符。而100-999中,共有900个数字,每个数字有3个字符,共2700个字符。我们将其累加,就可以得到从0开始到k位数的字符总和。如果n大于该数,说明还需要继续叠加,如果n小于等于该数,说明n在k位数之中。

我以2000这个数字举例,0-99有190个字符,0-999有2890个字符,因此2000在100-999之间,而100-999全都是3位数,因此2000-190=1810说明是从100开始的第1810个字符。1810除以3得到的整数位603,即从100开始的第603个数是602,余数为1,说明是602的第1个字符(索引从0开始计算),因此结果为0。时间复杂度为$O(log(n))$,空间复杂度为$O(log(n))$。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def findNthDigit(self, n: int) -> int:
if n < 10:
return n
current, next_ = 10, 190
k = 2
while next_ < n:
k += 1
current = next_
next_ = next_ + 9 * k * 10 ** (k - 1)
number = (n - current) // k + 10 ** (k - 1)
remain = (n - current) % k
return int(str(number)[remain])

刷题总结

  数学题目的规律往往需要按照数字的位数进行找规律,先找一位数,然后找两位数,然后找三位数,往往就可以发现一些规律。这种题不经常出现,但也是小伙伴们必须要掌握的,否则遇到就两眼一抹黑。

-------------本文结束感谢您的阅读-------------
0%