iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
自我挑戰組

用java解Leetcode系列 第 7

用java解Leetcode Day7

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250921/20169501JD64XHyfvr.pnghttps://ithelp.ithome.com.tw/upload/images/20250921/20169501i8gXPl3Zbb.png

  1. Reverse Integer

這題的目標是反轉一個32位元有號整數的位數。在反轉的過程中,需要檢查結果是否會超出32位元有號整數的範圍,如果超出,則回傳0。

這題的解題思路,就是要反轉一個整數,並處理溢位問題,主要可以拆成兩個核心步驟:1.反轉數字,這是最為直觀的部分。為了建構一個新的數字,要將一個數字的位數從後往前逐一取出,而新建構的數字跟原來的數字的順序是相反的。要取位數的話,可以利用取餘數運算x % 10,可以輕鬆取得x的個位數。接著,要移除位數,可以利用整數除法x / 10,可以將x的個位數移除,為下一次迴圈準備。上述步驟完成後,就能開始建構新數字了,用一個新的變數(例如reversed),每取得一個位數,就執行reversed = reversed * 10 + digit。這就像是將原數字的位數一個一個「推」到新數字的末尾。這個過程會在一個while迴圈中重複執行,直到原數字x變為0,代表所有的位數都已經被處理完畢。在處理反轉數字這部分的過程中,就要進行步驟2.處理溢位,這是最難的部分,因為題目要求不能使用64位元整數,所以在每一次更新reversed之前,就先預測「如果接下來進行這個運算,會不會超過32位元整數的範圍?」。判斷溢位的時機,要在執行reversed = reversed * 10 + digit這段程式碼之前,要是在這段程式碼之後才檢查,如果reversed * 10已經溢位,那這個reversed變數的值將會是錯誤的(java的整數溢位會自動循環,不會拋出異常)此時再進行判斷就沒有意義了。因此,**「先判斷,在運算」**是處理這種溢位問題的關鍵。這確保了程式碼總是在一個安全的範圍進行運算,並在可能發生溢位的前一步,就回傳正確的結果。至於判斷的方法,先分成正數溢位和負數溢位,在正數溢位中,32位元整數的最大值2,147,483,647。如果目前的reversed已經大於214,748,364(Integer.MAX_VALUE / 10),那麼再乘以10肯定會溢位。如果reversed剛好等於214,748,364,就看下一個要加上的digit是什麼。如果digit大於7(因為最大值的個位數是7),那麼也會溢位。在負數溢位中,在32位元整數的最小值是-2,147, 483,648。同樣地,如果reversed已經小於-214,748,364(Integer.MIN_VALUE / 10),乘以10後肯定會溢位。如果reversed剛好等於-214,748,364,且下一個digit小於-8(因為最小值的個位數是-8),也會溢位。如果檢測到任何溢位情況,就立即回傳0。如果整個迴圈順利完成都沒有溢位,就回傳最終的reversed。

簡單來說,這個解法就是一個「邊反轉邊檢查」的過程。


上一篇
用java解Leetcode Day6
下一篇
用java解Leetcode Day8
系列文
用java解Leetcode8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言