解决leetcode第3966题统计范围内的好整数

3966.统计范围内的好整数

难度:困难

问题描述:

给你三个整数l,r和k。

如果一个数字中每一对相邻数位之间的绝对差都至多为k,则称该数字为好数。

返回在范围l,r(包含边界)内的好整数的数量。

值x和y之间的绝对差定义为abs(x-y)。

示例1:

输入:l=10,r=15,k=1

输出:3

解释:

范围内的好整数有10、11和12。

对于10,abs(1-0)=1。

对于11,abs(1-1)=0。

对于12,abs(1-2)=1。

所有这些差值都至多为k=1。因此,答案为3。

示例2:输入:l=201,r=204,k=2

输出:2

解释:

范围内的好整数有201和202。

对于201,abs(2-0)=2且abs(0-1)=1。

对于202,abs(2-0)=2且abs(0-2)=2。

因此,答案为2。

提示:

10<=l<=r<=10**15

0<=k<=9

问题分析:

这是一个采用枚举算法的问题,主要解决如何判断一个整数是好整数,然后利用给定的整数范围,不断枚举,检验是好整数则输出并统计好整数个数。函数if_a_good_number(num,k),帮助判断整数num各相邻数字之差是否不大于k,从而确认num是否为好整数,返回判断的逻辑值。

程序如下:

python 复制代码
#判断一个整数是不是一个好整数,如果是,返回True,否则返回False
def if_a_good_number(num,k):
    num=str(num)
    n=len(num)
    for i in range(1,n):
        a=int(num[i-1])
        b=int(num[i])
        if abs(a-b)>k:
            return False
    else:
        return True

#主程序
l=int(input('pls input l='))
r=int(input('pls input r='))
k=int(input('pls input k='))
c=0
print(f'在[{l},{r}]内好整数有:')
for i in range(l,r+1):
    if if_a_good_number(i,k):
        c=c+1
        print(i,end=' ')
print()
print('共有好整数',c,'个')

运行实例一

pls input l=20

pls input r=30

pls input k=1

20,30内好整数有:

21 22 23

共有好整数 3 个

运行实例二

pls input l=234

pls input r=300

pls input k=2

234,300内好整数有:

234 235 242 243 244 245 246

共有好整数 7 个