【题目】
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
【我的解法】
class Solution { public: int maxNum = pow(2,31) - 1; int minNum = pow(-2,31); int reverse(int x) { //cout << maxNum <<"+" << minNum <<endl; string a = to_string(x); //cout << "source=" << a <<endl; int reversetemp; int index; int alen = a.length(); for(index = 0; index < alen/2; ++index){ reversetemp = a[index]; a[index] = a[alen - index -1]; a[alen - index -1] = reversetemp; } //cout << "reverse=" << a << endl; //去零 index = 0; while(a[index] == '0'){ index++; } if(index >= alen){ return 0; } if(a[alen - 1] == '-'){ return reverseNeg(&a[index]); } return reversePos(&a[index]); } int reverseNeg(string a) { int index; int alen = a.length(); a[alen - 1] = '\0'; //cout << "a=" << a << endl; long long retlong = 0; long long netRetLong = 0; int retint = 0; for(index = 0; index < a.length() - 1; ++index){ int temp = (int)(a[index]) - '0'; retlong = temp + retlong*10; netRetLong = -retlong; if(netRetLong < minNum){ return 0; } } return (int)netRetLong; } int reversePos(string a) { int index; //cout << "a=" << a << endl; long long retlong = 0; int retint = 0; for(index = 0; index < a.length(); ++index){ int temp = (int)(a[index]) - '0'; retlong = temp + retlong*10; if(retlong > maxNum){ return 0; } } return (int)retlong; } };
【别人的解法】
int reverse(int x) { int max = 0x7fffffff, min = 0x80000000;//int的最大值最小值 long rs = 0;//用long类型判断溢出 for(;x;rs = rs*10+x%10,x/=10);//逆序,正负通吃,不用单独考虑负值 return rs>max||rs<min?0:rs;//超了最大值低于最小值就返回0 }