AtCoder Context ABC 161 D Lunlun Number

运行要求
运行时间限制: 2sec
内存限制: 1024MB
https://atcoder.jp/contests/abc161/tasks/abc161_d微信

题目
若是一个正整数知足如下条件,那么这个正整数能够被称作Lunlun数app

  • Lunlun数用十进制表示的话,任意两个相邻的位数的差的绝对值在1如下

好比,1234,1,334能够叫作Lunlun数, 31415,119,13579不能叫作Lunlun数spa

给定一个正整数K,求从小到大第K个Lunlun数命令行

输入前提条件code

  • 1 <= K <= 100000
  • 全部的输入必须为整数

输入
输入都以如下标准从命令行输入blog

K

输出
输出答案排序


例1
输入递归

15

输出队列

23

升序排列到第15位的话
1,2,3,4,5,6,7,8,9,10,11,12,21,22,23内存

第15位是23,因此答案是23


例2
输入

1

输出

1

例3
输入

13

输出

21

例4
输入

100000

输出

3234566667

请注意,32位带符号的整型可能会溢出


读懂题目
它的意思就是说,咱们要找到符合条件的天然数当中的整数P。
整个整数P要知足十位数和百位数相差小于等于1,百位数和千位数相差小于等于1......

解题思路

1. 咱们很容易想到找到知足条件的1位数,找到知足条件的2位数,找到知足条件的3位数。。。直到找到的数的数量等于K,而后再排序
很容易想到这个图
名称未設定.001.jpeg

2. 知足条件的N位数能够衍生,生成知足条件的N+1位数
咱们能够简单地发现规律,以为能够经过递归的方法遍历到全部的数
可是本人尝试过之后,TLE了。时间上来不及。

3. 递归之外还有一个queue的办法,找到一个数后,把它衍生的数append到queue的后面

4.巧妙的是,这个queue的顺序就是能够按从小到大的顺序排列的

5.产生衍生的数字的方法
给定an,衍生的数字有三个
an*10 + (an % 10 - 1)
an*10 + (an % 10)
an*10 + (an % 10+1)

an % 10 = 0的状况下,产生的衍生有两个
an*10 + (an % 10)
an*10 + (an % 10+1)

an % 10 = 9的状况下,产生的衍生有两个
an*10 + (an % 10)
an*10 + (an % 10-1)

以下面的动图所示
名称未設定2.gif

代码

from collections import deque

K = int(input())

def calculate(n):
    q = deque()
    for i in range(1, 10):
        q.append(i)

    result = []

    while len(result) <= n:
        x = q.popleft()
        result.append(x)
        m = x % 10
        if m == 0:
            q.append(x * 10 + m)
            q.append(x*10+ m +1)
        elif m == 9:
            q.append(x*10 + m - 1)
            q.append(x * 10 + m)
        else:
            q.append(x*10 + m - 1)
            q.append(x * 10 + m)
            q.append(x*10 + m + 1)

    print(result[n-1])


calculate(K)

总结

这道题第一要注意到求衍生的方法
再次注意到用queue的append的话,能够获得升序的队列

※ 另外,我会在个人微信我的订阅号上推出一些文章,欢迎关注
二维码.jpg

相关文章
相关标签/搜索