这题的整体思路是通过深度优先取寻找10叉树的层数,确定层数之后再广度查找答案的位置
比如对n= 303,k=206 先找到10叉树应该是四层的(根节点也算)范围(1-999)
对于1开头的一共有1+10+100个不满足,所以cur+1找2开头的,(95<111所以是2开头的)
又因为2开头的也有111个数,所以k应该是在2为前缀的子树里的
首先将2这个数减去看是否满足,206-111-1=94不满足,所以进入20为前缀的子树一共有1+10个
所以94-11 = 83 进入21,22,23,24,25,26,27,28. 28的时候分支下的个数11大于k=83-77=6
所以进入28分支成为了280并k减去了1(28这个数)k=5
进280,281,282,283都不满足并且k-4=1
到284时满足,k=0
def findKthNumber(n, k):
def dfs(cur, n): # 深度优先,确定层数并计算当前cur为根的节点的个数看是否在这一分支
count = 0
first = cur
last = cur
while first <= n: #first其实是层数比如n= 1221, first=10000时终止说明有4层
count += min(last, n) - first + 1 #r如果这里的last>n说明不是满10叉树
first *= 10 #count计算当前前缀下的节点的个数
last = last * 10 + 9
return count
k -= 1
cur = 1
while k:
count = dfs(cur, n)
if count <= k: #如果小于k说明不在这个分支,换一个分支搜索
k -= count
cur += 1 # 广度优先
else: #大于说明就在这个分支,进入分支搜索子节点
k -= 1 #进入分支时,当前节点要减掉
cur *= 10
return cur