天天看點

leetcode7. Reverse Integer

1)肯定是先轉成string再倒過來。

2)int 表示的範圍是 - 2^31 ~ 2^31 - 1,是以倒過來有可能超出範圍,不能直接轉化成int,而是要做一個判斷。

3)反轉前要提取出負号,予以保留。

先考慮正數、int範圍内的情況吧。參考 https://blog.csdn.net/szu_aker/article/details/52422191 選擇了第三種方法——自己編寫反轉函數。成功地實作了反轉。然後對于負數,加個預處理,把符号位去掉。參考 http://blog.sina.com.cn/s/blog_491de9d60100c3bf.html ,用一個while循環去掉輸入整數末尾的0。當然,最後要把字元串轉成整型輸出,參考 http://lib.csdn.net/article/cplusplus/28418 。代碼如下:

class Solution {

public:

int reverse(int x) {

cout << x << endl;

stringstream ss;

ss << x;

string s,s_rev;

ss >> s;

int t = 0;

if (s[0] == '-') { 

t = 1;

s_rev = "-";

}

auto it = s.end() - 1;

while (*it == '0')

{

s.erase(it);

it -= 1;

}

for (int i = s.length()-1 ; i >= t; i--) {

s_rev += s[i];

}

return atoi(s_rev.c_str());

}

};

最後比較大小,當輸入是-12500000000000000時,輸出變成了-236561691明顯就不對了。把目前代碼放進去運作一下,跑出了1027/1032的正确率,剩下的肯定是出界問題沒考慮才錯的。是以肯定要處理一下的。

傳參的時候就有資訊丢失,這就很頭疼了。算了,先不考慮。隻考慮反過來之後越界的情況。是否可以先轉成long int再和邊界比較呢?結果轉成long int後報錯unary minus operator applied to unsigned type, result still unsigned。難道隻有正數才能比較?于是繼續倒騰。無奈,隻能把它加上2147483648變成正數再和[0, 4294967296)比較。改完後全部ac!!!

完整代碼:

class Solution {

public:

int reverse(int x) {

cout << x << endl;

stringstream ss;

ss << x;

string s,s_rev;

ss >> s;

int t = 0;

if (s[0] == '-') { 

t = 1;

s_rev = "-";

}

auto it = s.end() - 1;

while (*it == '0')

{

s.erase(it);

it -= 1;

}

for (int i = s.length()-1 ; i >= t; i--) {

s_rev += s[i];

}

signed long int l = atol(s_rev.c_str());

if ((l + 2147483648 >= 0) && (l + 2147483648 < 4294967296)) {

return l;

}

return 0;

}

};

leetcode7. Reverse Integer

但是,算法效率超級超級低。。。

——————————————————————————————————————————————————————

看了别人的解答。

INT_MAX和INT_MIN可以用來代替那一長串數字。

代碼複制不過來,不寫了。