最近打算練習寫代碼的能力,因此從簡單題開始作。
大部分仍是用C語言來解決。
@(解法).net
給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0。code
具體連接 https://leetcode-cn.com/problems/reverse-integer/blog
其實這算很基礎的問題了,首先就是想到利用循環結構,整數除法和取餘來解決。但也會遇到邊界值的問題,就要當心了。leetcode
初步的想法就是用一個while循環,在循環裏面解決取餘和倒序相加的工做。it
具體代碼以下:class
int reverse(int x) { int num = 0; while (x) { num = num * 10 + x % 10; if (num > INT_MAX || num < INT_MIN)//邊界值判斷 return 0; x = x / 10; } return num; }
可是這種結構很容易遇到一個問題,就是當num達到邊界時,再進行*10的運算就會==溢出==了,但判斷在運算以後。
可是我又想到在C語言中還有long int類型,因此只要定義num爲long int便可。
最後也經過了,代碼以下:基礎
int reverse(int x) { long int num = 0; while (x) { num = num * 10 + x % 10; if (num > INT_MAX || num < INT_MIN) return 0; x = x / 10; } return num; }
總結:這種改善也只是一種取巧的方法,當數據更大時就沒辦法了,並且會浪費不少空間。循環
因而我看了官方題解,發現官方是經過判斷num與邊界值的距離來避免溢出的。
我首先將if判斷進行了替換,但發現仍是不能經過,由於最小的邊界仍是會溢出,而後我發現官方題解中是先判斷再進行倒序操做的,這樣就能夠有效解決問題了。方法
int reverse(int x) { int num = 0; while (x) { if (num > INT_MAX/10 || (num == INT_MAX / 10 && (x%10) > 7)) return 0; if (num < INT_MIN/10 || (num == INT_MIN / 10 && (x%10) < -8)) return 0; num = num * 10 + x % 10; x = x / 10; } return num; }
我以爲這個方法要求的判斷條件太細緻了,而後去網上看了看其餘人的解法。有博主提到利用反推法判斷是否溢出,但其實這種方法也是先計算再判斷的。
具體連接 https://blog.csdn.net/bingkuoluo/article/details/83046469
我嘗試提交後發現仍然會面臨最大值溢出的問題,也不夠安全,暫時沒有找到更好的辦法。
注意語句的順序問題,尤爲是判斷語句和判斷條件的運算的問題。 要考慮數據的溢出問題。 在本題中,仍是要先判斷,再運算。