给定一个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
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param x int整型
* @return int整型
*/
#define intmax 2147483647
#define intmin -2147483648
int reverse(int x ) {
// write code here
int a=x;
if(a<0)
a=a*(-1);
int sum=0;
int temp;
while(a>0){
temp=a%10;
a=a/10;
if(sum>intmax/10 || (-sum)<intmin/10)
return 0;
//如果仅仅只考虑数字反转后的值是否溢出 则可能会出现sum=sum*10+temp导致溢出 结果有错误。所以在进行乘以10的操作之前 我们就要预判是否溢出
sum=sum*10+temp;
//printf("%d\n",sum);
}
if(sum>intmax || (-sum)<intmin)
return 0;
// if(x<0 )
// return sum*(-1);
// if(x>=0){
// //printf("%d ",sum);
// return sum;}
//return 0;
return x>0?sum:-1*sum;
} int reverse(int x ) {
// write code here
if(x==0) return 0;
int len=0, fushu=0, ret=0;
if(x<0) { // 负数先转化成正数
fushu =1;
x=0-x;
}
int p=x;
while(p>=10){ // 计算出整数位数
p/=10;
len++;
}
for(int i=len; i>=0; i--) {
int diwei = x%10;
ret = ret+diwei*pow(10,i); // 低位当成新整数的高位
printf("ret:%d\n",ret);
x/=10;
printf("x:%d\n",x);
}
if(ret<0) return 0; // 如果超过int范围会变成负数,返回0
if(fushu==1) ret = 0-ret;
if(ret>(pow(2,31)-1) || ret < (0-pow(2,31))) return 0;
return ret;
}
//使用辅助数组
#define INT_MAX 2147483647
#define INT_MIN -2147483648
int reverse(int x ) {
int split[32] = {0};
int temp = x < 0 ? -x : x;
int cur = 0;
int flag = 0;
while (temp){
int r = temp % 10;
if (r != 0){
split[cur++] = r % 10;
flag = 1;
}
else if (flag == 1)
split[cur++] = temp % 10;
temp /= 10;
}
long long res = 0;
for (int i = 0; i < cur; i++)
res += split[i] * ((int)pow(10, cur-i-1));
int num = (res > INT_MAX || res < INT_MIN) ? 0 : res;
return x < 0 ? -num : num;
}