解决leetcode第3753题范围内总波动值II

3753.范围内总波动值II

难度:困难

问题描述:

给你两个整数num1和num2,表示一个闭区间[num1,num2]。

一个数字的波动值定义为该数字中峰和谷的总数:

如果一个数位严格大于其两个相邻数位,则该数位为峰。

如果一个数位严格小于其两个相邻数位,则该数位为谷。

数字的第一个和最后一个数位不能是峰或谷。

任何少于3位的数字,其波动值均为0。

返回范围[num1,num2]内所有数字的波动值之和。

示例1:

输入:num1=120,num2=130

输出:3

解释:

在范围[120,130]内:

120:中间数位2是峰,波动值=1。

121:中间数位2是峰,波动值=1。

130:中间数位3是峰,波动值=1。

范围内所有其他数字的波动值均为0。

因此,总波动值为1+1+1=3。

示例2:

输入:num1=198,num2=202

输出:3

解释:

在范围[198,202]内:

198:中间数位9是峰,波动值=1。

201:中间数位0是谷,波动值=1。

202:中间数位0是谷,波动值=1。

范围内所有其他数字的波动值均为0。

因此,总波动值为1+1+1=3。

示例3:

输入:num1=4848,num2=4848

输出:2

解释:

数字4848:第二个数位8是峰,第三个数位4是谷,波动值为2。

提示:

1<=num1<=num2<=1015

问题分析:

解决本问题,设计函数get_peaks_and_valleys_in_num(n),其功能是从一个数字n中找出出现的峰和谷的总数并返回,在主程序中遍历从num1到num2的所有数字,并将出现的峰和谷的数量累加求和,最后得到[num1,num2]内所有数字的波动值之和。

程序如下:

python 复制代码
#统计一个数字n中有多少个峰和谷,返回统计的结果
def get_peaks_and_valleys_in_num(n):
    s=str(n)
    n=len(s)
    if n<3:
        return 0
    else:
        c=0
        for i in range(1,n-1):
            if (s[i]>s[i-1] and s[i]>s[i+1]) or (s[i]<s[i-1] and s[i]<s[i+1]):
                c=c+1
        return c

#主程序
num1=int(input('pls input num1='))
num2=int(input('pls input num2='))
t=0
for i in range(num1,num2+1):
    t=t+get_peaks_and_valleys_in_num(i)
print(f'[{num1},{num2}]内所有数字的波动值之和为{t}')

运行实例一

pls input num1=120

pls input num2=200

120,200\]内所有数字的波动值之和为44 #### 运行实例二 pls input num1=42315 pls input num2=42316 \[42315,42316\]内所有数字的波动值之和为6 #### 运行实例三 pls input num1=23 pls input num2=30 \[23,30\]内所有数字的波动值之和为0

相关推荐
吴佳浩1 小时前
Langchain 浅出
python·langchain·llm
mortimer2 小时前
破局视频翻译【最后一公里】––从语音克隆到口型对齐的完整工程思路
python·github·aigc
骑着猪去兜风.3 小时前
线段树(二)
数据结构·算法
门框研究员4 小时前
解锁Python的强大能力:深入理解描述符
python
fengfuyao9854 小时前
竞争性自适应重加权算法(CARS)的MATLAB实现
算法
散峰而望4 小时前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
leoufung4 小时前
LeetCode 92 反转链表 II 全流程详解
算法·leetcode·链表
子不语1805 小时前
Python——函数
开发语言·python
wyhwust5 小时前
交换排序法&冒泡排序法& 选择排序法&插入排序的算法步骤
数据结构·算法·排序算法