目标
给你两个整数 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
输出:
解释:
数字 4848:第二个数位 8 是峰,第三个数位 4 是谷,波动值为 2。
说明:
- 1 <= num1 <= num2 <= 10^5
思路
定义数字的波动值是数字中峰与谷的总数,峰指左右两侧的数字严格小于当前数字,谷指左右两侧的数字严格大于当前数字。求 [nums1, nums2] 中数字波动值的总和。
暴力计算每个数字的波动值。
代码
/**
* @date 2026-06-04 9:04
*/
public class TotalWaviness3751 {
public int totalWaviness(int num1, int num2) {
int res = 0;
for (int i = num1; i <= num2; i++) {
String s = String.valueOf(i);
for (int j = 1; j < s.length() - 1; j++) {
if ((s.charAt(j) > s.charAt(j - 1) && s.charAt(j) > s.charAt(j + 1)) ||
((s.charAt(j) < s.charAt(j - 1) && s.charAt(j) < s.charAt(j + 1)))) {
res++;
}
}
}
return res;
}
}
性能
