最近開始刷刷的Leetcode題,遇到了一道這麼一個簡單的題 Reverse Integer ,然而並無看上去的那麼簡單,python
特殊的坑就如這道題說的 overflow !ios
一開始天真的認爲就是每一個語言本身定義的最大整數,如c++
在python中函數
>>import sys >>print sys.maxint >>2147483647
在c++中:code
#include <iostream> int main(){ std::cout<< (unsigned int) -1<<std::endl; //結果是4294967295 return 0; }
因而按照這個認識,所寫代碼以下:(選python是由於用到了python的內置函數的特性)leetcode
class Solution: # @param {integer} x # @return {integer} def reverse(self, x): import sys if x > (sys.maxint) : return 0 if x >= 0 : return int(str(x)[::-1]) if int(str(x)[::-1]) < sys.maxint else 0 else: return 0-int(str(-x)[::-1]) if int(str(-x)[::-1]) < sys.maxint else 0
Input: 1534236469 Output: 9646324351 Expected: 0
事實證實太年輕,後來仔細閱讀了提示,才發現get
原來這不是一個簡簡單單的例子的假設,而是題目要求,因而改寫爲下面的代碼:io
class Solution: # @param {integer} x # @return {integer} def reverse(self, x): import sys if x > (2**31-1) : return 0 if x >= 0 : return int(str(x)[::-1]) if int(str(x)[::-1]) < (2**31-1) else 0 else: return 0-int(str(-x)[::-1]) if int(str(-x)[::-1]) < (2**31) else 0
這樣結果就正常了,class
下面是用c++寫的:import
#define max_int (1<<31)-1 class Solution { public: int reverse(int num) { bool flag = (num<0)?0:1;//判斷輸入的數的正負 num = (num>0)?num:-num;//以非負數處理 int result = 0; if (num>max_int) {return 0;} while(num!=0){ if (result >(max_int-num%10)/10){return 0;} //若是已經overflow,就會比max_int小,這樣判斷 result = result*10 + num%10; std::cout<<result<<std::endl; num/=10; } return (flag)?result:-result; } };