问题描述
定义「顺次数」为:每一位上的数字都比前一位上的数字大 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)) |
运行结果: