iT邦幫忙

2025 iThome 鐵人賽

0
自我挑戰組

leetcode系列 第 29

LeetCode 第 29 題:Divide Two Integers

  • 分享至 

  • xImage
  •  

題目:
https://ithelp.ithome.com.tw/upload/images/20251020/20169340P5Sj7gTbsM.png
給定兩個整數dividend和,不使用乘法、除法和模運算子divisor來除兩個整數。

整數除法應向零方向截斷,這意味著會丟失小數部分。例如,8.345將被截斷為8,而-2.7335將被截斷為-2。

返回除以後的商數。dividenddivisor

注意:假設我們正在處理一個只能儲存32 位元有符號整數範圍內整數的環境:。對於這個問題,如果商嚴格大於,則返回,如果商嚴格小於,則返回。
https://ithelp.ithome.com.tw/upload/images/20251020/201693409zNV4zRfoU.png
這題不能用 /,要用「減法 + 位移」模擬除法。

🪜 步驟

處理特殊情況

若 dividend == Integer.MIN_VALUE && divisor == -1 → 溢出 → 回傳 Integer.MAX_VALUE。

統一符號處理

用布林變數 negative 記錄最終結果的正負。

轉成 long 型別避免溢出。

將兩數都轉為正數(取絕對值)。

核心演算法:倍增法(Bit Shifting)

不斷從 dividend 中減去 divisor 的倍數。

透過位移快速找到最大可減的倍數:

while dividend >= divisor:
temp = divisor
multiple = 1
while dividend >= (temp << 1):
temp <<= 1
multiple <<= 1
dividend -= temp
result += multiple

用左移(<<)等價於乘 2,可加速運算。

恢復正負號


上一篇
leetcode 28 Find the Index of the First Occurrence in a String
下一篇
leetcode 30. Substring with Concatenation of All Words
系列文
leetcode30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言