leetcode.windliang.cc/ 第一時間發佈java
很簡單,就是輸入整數,輸出它的倒置。spa
第一反應就是, 取餘獲得個位數,而後除以 10 去掉個位數,而後用一個變量保存倒置的數。3d
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
rev = rev * 10 + pop;
}
return rev;
}
複製代碼
而後彷佛不是那麼理想。code
爲何呢?倒置過來不該該是 9646324351 嗎。其實題目裏講了,int 的範圍是 $$[-2^{31} ,2^{31}-1]$$ 也就是 $$[-2147483648,2147483647] $$ 。明顯 9646324351 超出了範圍,形成了溢出。因此咱們須要在輸出前,判斷是否溢出。cdn
問題的關鍵就是下邊的一句了。blog
rev = rev * 10 + pop;leetcode
爲了區分兩個 rev ,更好的說明,咱們引入 temp 。get
temp = rev * 10 + pop;it
rev = temp;io
咱們對 temp = rev * 10 + pop; 進行討論。intMAX = 2147483647 , intMin = - 2147483648 。
對於大於 intMax 的討論,此時 x 必定是正數,pop 也是正數。
對於小於 intMin 的討論同理。
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 ) return 0;
if (rev < Integer.MIN_VALUE/10 ) return 0;
rev = rev * 10 + pop;
}
return rev;
}
複製代碼
時間複雜度:循環多少次呢?數字有多少位,就循環多少次,也就是 $$log_{10}(x) + 1$$ 次,因此時間複雜度是 O(log(x))。
空間複雜度:O(1)。
固然咱們能夠不用思考那麼多,用一種偷懶的方式 AC ,咱們直接把 rev 定義成 long ,而後輸出前判斷 rev 是否是在範圍內,不在的話直接輸出 0 。
public int reverse(int x) {
long rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
rev = rev * 10 + pop;
}
if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE ) return 0;
return (int)rev;
}
複製代碼
比較簡單的一道題,主要是在考判斷是否是溢出,又是輕鬆的一天!