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;
}
};
但是,算法效率超級超級低。。。
——————————————————————————————————————————————————————
看了别人的解答。
INT_MAX和INT_MIN可以用來代替那一長串數字。
代碼複制不過來,不寫了。