解題說明
Count Odd Numbers in an Interval Range
題目描述:
給定兩個非負整數 low 和 high,回傳 low 到 high 之間(含兩端)的奇數個數。
解題思路:
利用數學公式直接計算。從 0 到 n 之間有 (n + 1) / 2 個奇數(使用整數除法)。因此 [low, high] 之間的奇數個數等於「0 到 high 的奇數個數」減去「0 到 low-1 的奇數個數」。
簡化後:(high + 1) / 2 - low / 2。
更直觀的理解:若 low 或 high 為奇數,奇數個數為 (high - low) / 2 + 1;若兩者都為偶數,則為 (high - low) / 2。但公式 (high + 1) / 2 - low / 2 統一處理所有情況。
C++ 解法
複雜度分析
時間複雜度:O(1) — 純數學計算。
空間複雜度:O(1) — 無額外空間。
虛擬碼
1. Return (high + 1) / 2 - low / 2 (This counts odd numbers from 0 to high, minus odd numbers from 0 to low-1)
其他解法
暴力遍歷 O(high - low):從 low 到 high 逐一檢查奇偶性並計數。簡單但 high - low 很大時效率極差。
位元運算判斷:ans = (high - low) / 2 + (low & 1 | high & 1)。利用位元運算判斷端點是否為奇數。等價公式,效率相同。
延伸思考
- 若要計算 [low, high] 中的偶數個數,公式如何修改?
- 若 low 和 high 可以是負數,公式是否仍然正確?
- 若要計算 [low, high] 中能被 k 整除的數的個數,如何推廣?