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