// 演算法 / Algorithm:
// 與 C 版相同：暴力枚舉 [num1, num2]，逐位拆解每個數，統計中間數位的山峰與山谷。
// Same as the C version: brute-force the range, split each number into digits,
// and count peaks/valleys among the interior digits. n <= 1e5 keeps it fast.

class Solution {
public:
    int totalWaviness(int num1, int num2) {
        int total = 0;                           // 累計波動度 / running sum

        // range-for 不適用於數值區間，這裡用傳統 for 枚舉每個 n / classic for over the range
        for (int n = num1; n <= num2; ++n) {
            // vector<int> 是會自動管理長度的動態陣列 / dynamic array that tracks its own size
            std::vector<int> digits;

            // 逐位拆解：%10 取末位、/10 去末位 / extract digits (reversed order, fine for counting)
            for (int t = n; t > 0; t /= 10) {
                digits.push_back(t % 10);        // push_back 在尾端加入一個元素 / append one digit
            }

            int len = (int)digits.size();        // size() 回傳元素個數 / number of digits
            if (len < 3) continue;               // 少於 3 位波動度為 0 / waviness 0, skip

            // 掃描中間數位 (索引 1 .. len-2) / scan interior digits only
            for (int i = 1; i < len - 1; ++i) {
                int left  = digits[i - 1];       // 左鄰居 / left neighbor
                int mid   = digits[i];           // 當前數位 / current digit
                int right = digits[i + 1];       // 右鄰居 / right neighbor

                // 山峰或山谷都讓波動度 +1 / a peak OR a valley adds 1
                if (mid > left && mid > right)        ++total;  // 峰 / peak
                else if (mid < left && mid < right)   ++total;  // 谷 / valley
                // 相等或一上一下不計 / ties and monotone steps contribute nothing
            }
        }

        return total;                            // 回傳答案 / return the total
    }
};
