標籤:
最近開始刷刷的Leetcode題,遇到了一道這麼一個簡單的題 Reverse Integer ,然而並沒有看上去的那麼簡單,
特殊的坑就如這道題說的 overflow !
一開始天真的認為就是每個語言自己定義的最大整數,如
在python中
>>import sys>>print sys.maxint>>2147483647
在c++中:
#include <iostream>int main(){ std::cout<< (unsigned int) -1<<std::endl; //結果是4294967295 return 0;}
於是按照這個認識,所寫代碼如下:(選python是因為用到了python的內建函數的特性)
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: 1534236469Output: 9646324351Expected: 0
事實證明太年輕,後來仔細閱讀了提示,才發現
原來這不是一個簡簡單單的例子的假設,而是題目要求,於是改寫為下面的代碼:
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
這樣結果就正常了,
下面是用c++寫的:
#define max_int (1<<31)-1class 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; }};
LeetCode Reverse Integer