给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果
1.只反转数字部分,符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [−231, 231 − 1] ,返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)
数据范围:
-231 <= x <= 231-1
12
21
-123
-321
10
1
1147483649
0
import java.util.*; //最好借助数学思想(L*10+x%10),不要想用字符串反转方法, //因为字符串反转还需要考虑1000这种情况,反而变得复杂了 public class Solution { /** * * @param x int整型 * @return int整型 */ public int reverse (int x) { // write code here long l=0; int flag=1; if(x<0){ x=-x; flag=-1; } while(x!=0){ l=l*10+x%10; x=x/10; } if(l>=Integer.MIN_VALUE && l<=Integer.MAX_VALUE){ return flag*(int)l; }else{ return 0; } } }
//须要考虑益处的情况,int类型能表示的最大和最小的数分别是2^32-1,-2^31 class Solution { public: int reverse(int x) { vector<int> v; long long ans=0; bool tag=true; const int max32 = 0x7fffffff; const int min32 = 0x80000000; if(x<0) { tag=false; x=0-x; } while(x) { v.push_back(x%10); x/=10; } for(int i=0;i<v.size();i++) { ans=ans*10+v[i]; } if(ans<min32||ans>max32) return 0; if(tag) return ans; else return 0-ans; } };
public class Solution { public int reverse(int x) { if(x == 0){ return x; } StringBuffer buffer = new StringBuffer(); boolean isFu = x<0?true:false; if(isFu) buffer.append("-"); int y = Math.abs(x); while(y%10 == 0){// 去掉末尾的0 y = y/10; } while(y/10 != 0){ buffer.append(y%10); y= y/10; } buffer.append(y); return Integer.parseInt(buffer.toString()); } }
class Solution { public: /** * * @param x int整型 * @return int整型 */ int reverse(int x) { int r = 0; while (x) { // 判溢出 if (r > 0 && r > (INT_MAX - x % 10) / 10) return 0; if (r < 0 && r < (INT_MIN - x % 10) / 10) return 0; r = r * 10 + x % 10; x /= 10; } return r; } };注意:负数取模仍为负数。
# # # @param x int整型 # @return int整型 # import sys class Solution: def reverse(self , x ): # 判断值是否越界,对于Python3可不做此操作 # if x > sys.maxsize&nbs***bsp;x < -sys.maxsize -1: # return 0 res = 0 num = abs(x) while num: res = res*10 + num%10 num = int(num/10) if x>0: return res else: return -res
class Solution { bool isOverflow=false; public: int reverse(int x) { int flag=1; if(x<0)flag=-1,x=-x; string tmp=to_string(x); ::reverse(tmp.begin(),tmp.end()); string imax=to_string(INT_MAX); if(tmp.size()>= imax.size() && tmp>imax){ isOverflow=true; return 0; } return stoi(tmp)*flag; } };
class Solution { public: int reverse(int x) { int num = abs(x), ret(0); while(num > 0){ //先检查是否会溢出 if(ret > (INT_MAX - num%10) / 10) return 0; ret = ret * 10 + num %10; num = num / 10; } return x>0 ? ret : -ret; } };检查溢出的不等式来自于:res*10 + num%10 > INT_MAX。此不等式若成立,则会溢出,返回0即可。
//本体关键点是如何判断溢出。 //推荐解答用的是用long类型存储结果,如果结果大于0x7fffffff或者小于0x80000000就溢出 //我的解法是每次计算新的结果时,再用逆运算判断与上一次循环的结果是否相同,不同就溢出 public int reverse(int x) { int res=0; while(x!=0){ //最后一位 int tail=x%10; int newRes=res*10+tail; //如果newRes-tail)/10!=res说明产生了溢出 if((newRes-tail)/10!=res) return 0; res=newRes; x=x/10; } return res; }
// 与剑指offer上的一道题很相似,要考虑溢出 public class Solution { public int reverse(int x) { if(x == 0) return x; String num = String.valueOf(x); int inx = 0; boolean minus = false; if(num.charAt(0) == '-'){ minus = true; inx++; } long res = 0; for(int i = num.length() - 1; i >= inx ; i--){ int flag = minus ? -1 : 1; res = res * 10 + flag * (num.charAt(i) - '0'); if(isOverflow(res)) return 0; } return (int) res; } public boolean isOverflow(long x){ if(x > 0){ if(x > 0x7fffffff) return true; } else{ if(x < 0x80000000) return true; } return false; } }
int reverse(int x) { long long res = 0; while (x) { res = res*10 + x%10; x /= 10; } return (res > INT_MAX || res < INT_MIN) ? 0 : res; }
public class Solution { public int reverse(int x) { int res = 0; while (x != 0) { int pop = x % 10; x /= 10; if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && pop >= 7)) { return -1; } if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && pop <= -8)) { return -1; } res = res * 10 + pop; } return res; } }