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