给定一个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;
}
}