定义「顺次数」为:每一位上的数字都比前一位上的数字大 1 的整数。
请你返回由 [low, high] 范围内所有顺次数组成的 有序 列表(从小到大排序)。
示例 1:
输出:low = 100, high = 300
输出:[123,234]
示例 2:
输出:low = 1000, high = 13000
输出:[1234,2345,3456,4567,5678,6789,12345]
解决方案
通过对题意的理解,得知此题的目的后,按以下解题步骤来解决该题。
第一步就是提取题目中的关键信息,找准解题的关键步骤。每个数字的“头”和“尾”非常重要,比如示例1中的low,他的“头”就是1,于是就可以得出第一个顺次数为123,然后再由123的“头”和“尾”可以得出下一个数。用列表表示为:list(range(head_num,tail_num)),然后为了不超过high,所以每得出一个数就要和high比较,小于它就就保留,反之则终止程序。
经过第一步后可以发现,已经能通过一些用例了,下一步就是输入的位数增大,比如示例2,程序得到6789时,如果继续运行得到的就是78910,显然不符合题目要求,所以就需要对每一个数的“尾”进行判断,如果tail_num大于9了,就让head_num=1,然后生成列表的长度也要加1,于是就会得到12345,答案就正确了。
代码示例:
low,high = map(int,input().split())
def jiang(low,high):
res = []
l = len(str(low))
head_num = int(str(low)[0])
if head_num + l > 10:
head_num = 1
l += 1
res_num = int(''.join(map(str,list(range(head_num,head_num+l)))))
while res_num < high:
res_num = int(''.join(map(str,list(range(head_num,head_num+l)))))
tail_num = int(str(res_num)[-1])
if low<=res_num <= high:
res.append(res_num)
if tail_num == 9:
l += 1
head_num = 0
head_num += 1
return res
print(jiang(low,high))
运行结果:
结语
通过这道题可以得出,细节对于解题思路及方法是至关重要的。有时候题目本身并不难,难的是理解题目。