Welcome to Subscribe On Youtube
3751. Total Waviness of Numbers in Range I
Description
You are given two integers num1 and num2 representing an inclusive range [num1, num2].
The waviness of a number is defined as the total count of its peaks and valleys:
- A digit is a peak if it is strictly greater than both of its immediate neighbors.
- A digit is a valley if it is strictly less than both of its immediate neighbors.
- The first and last digits of a number cannot be peaks or valleys.
- Any number with fewer than 3 digits has a waviness of 0.
Return the total sum of waviness for all numbers in the range [num1, num2].
Example 1:
Input: num1 = 120, num2 = 130
Output: 3
Explanation:
In the range[120, 130]:
120: middle digit 2 is a peak, waviness = 1.121: middle digit 2 is a peak, waviness = 1.130: middle digit 3 is a peak, waviness = 1.- All other numbers in the range have a waviness of 0.
Thus, total waviness is 1 + 1 + 1 = 3.
Example 2:
Input: num1 = 198, num2 = 202
Output: 3
Explanation:
In the range[198, 202]:
198: middle digit 9 is a peak, waviness = 1.201: middle digit 0 is a valley, waviness = 1.202: middle digit 0 is a valley, waviness = 1.- All other numbers in the range have a waviness of 0.
Thus, total waviness is 1 + 1 + 1 = 3.
Example 3:
Input: num1 = 4848, num2 = 4848
Output: 2
Explanation:
Number 4848: the second digit 8 is a peak, and the third digit 4 is a valley, giving a waviness of 2.
Constraints:
1 <= num1 <= num2 <= 105
Solutions
Solution 1: Simulation
We define a helper function $f(x)$ to calculate the waviness value of integer $x$. In this function, we store each digit of integer $x$ in an array $\textit{nums}$. If the number has fewer than 3 digits, the waviness value is 0. Otherwise, we iterate through each non-leading and non-trailing digit in the array $\textit{nums}$, determine whether it is a peak or valley, and count the waviness value.
Then, we iterate through each integer $x$ in the range $[\textit{num1}, \textit{num2}]$ and accumulate its waviness value $f(x)$ to obtain the final result.
The time complexity is $O((\textit{num2} - \textit{num1} + 1) \cdot \log \textit{num2})$ and the space complexity is $O(\log \textit{num2})$.
-
class Solution { public int totalWaviness(int num1, int num2) { int ans = 0; for (int x = num1; x <= num2; x++) { ans += f(x); } return ans; } private int f(int x) { int[] nums = new int[20]; int m = 0; while (x > 0) { nums[m++] = x % 10; x /= 10; } if (m < 3) { return 0; } int s = 0; for (int i = 1; i < m - 1; i++) { if ((nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) || (nums[i] < nums[i - 1] && nums[i] < nums[i + 1])) { s++; } } return s; } } -
class Solution { public: int totalWaviness(int num1, int num2) { int ans = 0; for (int x = num1; x <= num2; x++) { ans += f(x); } return ans; } int f(int x) { int nums[20], m = 0; while (x > 0) { nums[m++] = x % 10; x /= 10; } if (m < 3) { return 0; } int s = 0; for (int i = 1; i < m - 1; i++) { if ((nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) || (nums[i] < nums[i - 1] && nums[i] < nums[i + 1])) { s++; } } return s; } }; -
class Solution: def totalWaviness(self, num1: int, num2: int) -> int: def f(x: int) -> int: nums = [] while x: nums.append(x % 10) x //= 10 m = len(nums) if m < 3: return 0 s = 0 for i in range(1, m - 1): if nums[i] > nums[i - 1] and nums[i] > nums[i + 1]: s += 1 elif nums[i] < nums[i - 1] and nums[i] < nums[i + 1]: s += 1 return s return sum(f(x) for x in range(num1, num2 + 1)) -
func totalWaviness(num1 int, num2 int) (ans int) { for x := num1; x <= num2; x++ { ans += f(x) } return } func f(x int) int { nums := make([]int, 0, 20) for x > 0 { nums = append(nums, x%10) x /= 10 } m := len(nums) if m < 3 { return 0 } s := 0 for i := 1; i < m-1; i++ { if (nums[i] > nums[i-1] && nums[i] > nums[i+1]) || (nums[i] < nums[i-1] && nums[i] < nums[i+1]) { s++ } } return s } -
function totalWaviness(num1: number, num2: number): number { let ans = 0; for (let x = num1; x <= num2; x++) { ans += f(x); } return ans; } function f(x: number): number { const nums: number[] = []; while (x > 0) { nums.push(x % 10); x = Math.floor(x / 10); } const m = nums.length; if (m < 3) return 0; let s = 0; for (let i = 1; i < m - 1; i++) { if ( (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) || (nums[i] < nums[i - 1] && nums[i] < nums[i + 1]) ) { s++; } } return s; }