leetcode 2---Reverse Integer,reverseinteger
題記:
由於臨近畢業要找工作,雖然看了一遍資料結構和演算法,但是總感覺心裡發虛。而且項目中所接觸到得編程都是基於其他方面得改進演算法,總之本人編程能力有限,經常被人鄙視,所以下定決心,慢慢爬行,一點點刷leetcode,這也是寫這些部落格得緣由,記錄在遇到題目時得分析思路,及解決方案。
---------- 我走的慢,但我從不後退。
===============================================================================================================
題目:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
----
愚解:
看到這個題目不要上來動手寫程式,為什嗎?因為你沒有考慮周全,如果上來就寫,在寫程式得過程中會發現很多情況,就會卡在那裡。應該分析,主要有一下幾點;
1.如果末尾是0改怎麼輸出,如10 ,100,
2. 所要重點注意得溢出,因為int類型不管有無符號都有其邊界值,超過邊界值時就會溢出,如1000000003 ,本題目假的溢出時返回結果為0
從分析來看,該題目重點考察的時對溢出情況得處理,那麼對於一個整數,我們很容易取得各位上得數字,但是如何判斷將它反轉是否溢出呢,這個問題我也了好久,也嘗試了幾種方法,但我覺最可靠得是下面得一種思路。對於一個整數,不管它是正還是負,如果翻轉之後不溢出得話,那麼翻轉前得數字應該與翻轉後得數字相同,如 : 翻轉前 123,翻轉後 321 ,如果不溢出,那麼翻轉後最高位上得數字必須等於翻轉前最低位上得數字,一旦不相同,那麼在翻轉得過程中肯定出現了溢出,可以直接 return 0 處理。明白了這個道理,那麼代碼新手拈來:
/************************************************************************* > File Name: reverseInteger.cc > Author: Jerry Shi > Mail: jerryshi0110@gmail.com > Created Time: 2014年12月28日 星期日 10時43分39秒 ************************************************************************/#include<iostream>#include<cstdlib>using namespace std;class Solution{public:int reverse(int x){int sign = (x < 0) ? -1 : 1;x = abs(x); char buf[12]; //max length of int is 10int i = 0;int j = 0;int result = 0; int temp;//get signwhile(x){buf[i] = x % 10;x /= 10;result = result*10 + buf[i];++i;} temp = result;while(i){if(temp % 10 != buf[i-1]){return 0;}temp /= 10;--i;}return sign * result;}};int main(void){int test = 1534236469;Solution mtest;int result;result = mtest.reverse(test);cout << "inverse result: " << result << endl;return 0;}提交代碼之後,測試通過,測試結果時用時 60ms,上述得代碼可以更精簡,但主旨得解決方案不變。後來又看討論區中大家得方法,基本都是採用上述分析得方法去判斷是否溢出,還有一個時用一個int64得變數來接收翻轉後得結果,然後與INT_MAX和INT_MIN進行比較判斷是否溢出,此方法針對此種情形可以解決問題,但若給定得uint64,則行不通。