首页 > 试题广场 >

反转数字

[编程题]反转数字
  • 热度指数:63872 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果
1.只反转数字部分,符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [−231,  231 − 1] ,返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)

数据范围:
-231 <= x <= 231-1
示例1

输入

12

输出

21
示例2

输入

-123

输出

-321
示例3

输入

10

输出

1
示例4

输入

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;
}

发表于 2023-01-04 21:53:54 回复(0)
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;
}
发表于 2022-11-10 17:00:14 回复(0)
//使用辅助数组
#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;
}

发表于 2021-11-15 17:21:27 回复(1)