解决leetcode第3869题.统计区间内奇妙数的数目

3869.统计区间内奇妙数的数目

难度:困难

问题描述:

给你两个整数l和r。

如果一个整数的数位形成一个严格单调序列,即数位是严格递增或严格递减的,那么这个整数被称为好数。所有一位数都被认为是好数。

如果一个整数是好数,或者它的数位和是好数,那么这个整数被称为奇妙数。

返回一个整数,表示在区间l,r(包含边界)内的奇妙数的数量。

如果一个序列中的每个元素都严格大于其前一个元素(如果存在),则该序列被称为严格递增。

如果一个序列中的每个元素都严格小于其前一个元素(如果存在),则该序列被称为严格递减。

示例1:

输入:l=8,r=10

输出:3

解释:

8和9是一位数,所以它们是好数,因此也是奇妙数。

10的数位为1,0,形成了一个严格递减的序列,所以10是好数,因此也是奇妙数。

因此,答案是3。

示例2:

输入:l=12340,r=12341

输出:1

解释:

12340

12340不是好数,因为1,2,3,4,0不是严格单调的。

数位和为1+2+3+4+0=10。

10是好数,因为它的数位为1,0,是严格递减的。因此,12340是奇妙数。

12341

12341不是好数,因为1,2,3,4,1不是严格单调的。

数位和为1+2+3+4+1=11。

11不是好数,因为它的数位为1,1,不是严格单调的。因此,12341不是奇妙数。

因此,答案是1。

示例3:

输入:l=123456788,r=123456788

输出:0

解释:

123456788不是好数,因为它的数位不是严格单调的。

数位和为1+2+3+4+5+6+7+8+8=44。

44不是好数,因为它的数位为4,4,不是严格单调的。因此,123456788不是奇妙数。

因此,答案是0。

提示:

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

问题分析:

解决这个问题分两步:

一是如何判断一个整数是一个奇妙数,要么组成这个数本身的各位数字是严格递增或严格递减的,也就是说是一个好数,或者组成这个数字的各位数字和是一个好数,那么这个数字就是一个奇妙数。程序设计了strictly_increasing(num)函数,用于判断一个整数的各位数字是否严格递增,进而设计 increasing_or_decreasing(num)函数判断一个整数是否严格递增或递减,最后设计函数judge_wonder_num(num),用于判断一个整数是否是一个奇妙数。

二是遍历由给定的l和r组成的区间l,r中的每个整数,检验是否为奇妙数,如果是奇妙数则计数,最后将统计出来的奇妙数数目输出,问题得到解决。

程序如下:

python 复制代码
#判断一个整数的各位数字是否严格递增,如果是,返回True,否则返回False
def strictly_increasing(num):
    num=str(num)
    num=list(num)
    n=len(num)
    for i in range(1,n):
        if num[i]<=num[i-1]:
            return False
    else:
        return True

#判断一个整数的各位数字是否严格递增或递减,如果是,返回True,否则返回False
def increasing_or_decreasing(num):
    t=int(str(num)[::-1])
    return strictly_increasing(num) or strictly_increasing(t)

#判断一个整数是否为奇妙数,如果是,返回True,否则返回False
def judge_wonder_num(num):
    t=str(num)
    t=list(t)
    t=list(int(i) for i in t)
    s=sum(t)
    return increasing_or_decreasing(num) or increasing_or_decreasing(s)

#主程序
l,r=eval(input('pls input l,r='))
c=0
print('奇妙数有:',end='')
for i in range(l,r+1):
    if judge_wonder_num(i):
        print(i,end=' ')
        c+=1
print(',共有奇妙数',c,'个')

运行实例一

pls input l,r=891,900

奇妙数有:891 892 893 894 896 897 898 899 900 ,共有奇妙数 9 个

运行实例二

pls input l,r=12438,12439

奇妙数有:12438 12439 ,共有奇妙数 2 个

相关推荐
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
梦想不只是梦与想5 小时前
PyTorch、CPU、GPU、CUDA
人工智能·pytorch·python·深度学习·机器学习·cuda
数字融合5 小时前
透明化视频孪生危化安全管控解决方案
人工智能·python·安全
罗西的思考5 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
别问!问就是全会6 小时前
Jupyter Notebook 安装包下载|单元格分块运行,图表直接内嵌
ide·python·其他·jupyter
深蓝AI7 小时前
Python 缓存击穿实测:16 个并发请求如何只回源 1 次
python
benchmark_cc7 小时前
用 00700.HK 做港股行情清洗:字段核对、校验与个人量化开发实践
python·数据分析·pandas·量化交易·股票数据·quantdash
nm_zfyjt7 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
zh路西法8 小时前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace
后台模板学习8 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt