7. Reverse Integer

第一次提交

int reverse(int x)
{
    int str[11];
    int renumber = 0;
    int flags = 0;
    //做参数范围判断
    if(x > pow(2,31) - 1 || x < -pow(2,31))
    {
        printf("%d",x);
        return 0;
    }
    //判断x的符号
    if(x > 0)
    {
        flags = 1;  //表示x是正数
    }
    else
    {
        flags = 0;  //0表示负数
    }
    x = abs(x);
    int j = 1;
    int i = 0;
    int c = 0;
    while(x / j !=0)
    {
        str[i] = x / j - (x / (j * 10)) * 10;  //第27行
        j = j* 10;
        i++;
        c++;
    }

//    for(i=c-1; i>=0; i--)
//    {
//         if(i!=0)
//             printf("%d ",str[i]);
//         else printf("%d",str[i]);
//    }
    j = 1;
    for(int i = c-1;i >= 0;i--)
    {
        renumber = str[i] * j + renumber;
        j = j * 10;
    }
    if(flags)
    {
        return renumber;
    }
    else
    {
        return -renumber;
    }
}

错误:

Line 27: Char 34: runtime error: signed integer overflow: 1000000000 * 10 cannot be represented in type 'int' (solution.c)

第二次提交

int reverse(int x)
{
    int str[11];
    int renumber = 0;
    int flags = 0;
    //做参数范围判断
    if(x > pow(2,31) - 1 || x < -pow(2,31))
    {
        printf("%d",x);
        return 0;
    }
    //判断x的符号
    if(x > 0)
    {
        flags = 1;  //表示x是正数
    }
    else
    {
        flags = 0;  //0表示负数
    }
    x = abs(x);  //第21行
    long j = 1;
    int i = 0;
    int c = 0;
    while(x / j !=0)
    {
        str[i] = x / j - (x / (j * 10)) * 10;
        j = j* 10;
        i++;
        c++;
    }

//    for(i=c-1; i>=0; i--)
//    {
//         if(i!=0)
//             printf("%d ",str[i]);
//         else printf("%d",str[i]);
//    }
    j = 1;
    for(int i = c-1;i >= 0;i--)
    {
        renumber = str[i] * j + renumber;
        j = j * 10;
    }
    if(flags)
    {
        return renumber;
    }
    else
    {
        return -renumber;
    }
}

错误

Line 21: Char 7: runtime error: negation of -2147483648 cannot be represented in type 'int'; cast to an unsigned type to negate this value to itself (solution.c)

这里错误的原因是,当输入 -2147483648时,使用

x = abs(x);

再次给x赋值时,超出了int类型的最大范围,int类型的最大范围是2147483647
第三次提交:

int reverse(int x)
{
    int str[11];
    int renumber = 0;
    int flags = 0;
    //做参数范围判断
//    if(x < (-2147483648) || x >(2147483647))  //边界值
//    {
//        printf("%d",x);
//        return 0;
//    }
    if(x == 0)
    {
        return 0;
    }
    //判断x的符号
    if(x > 0)
    {
        flags = 1;  //表示x是正数
    }
    else
    {
        flags = 0;  //0表示负数
        printf("flags=%d",flags);
        if(x == -2147483648)
        {
            return 0;
        }
    }
    x = abs(x);

    long j = 1;
    int i = 0;
    int c = 0;
    while(x / j !=0)
    {
        str[i] = x / j - (x / (j * 10)) * 10;
        j = j* 10;
        i++;
        c++;
    }

//    for(i=c-1; i>=0; i--)
//    {
//         if(i!=0)
//             printf("%d ",str[i]);
//         else printf("%d",str[i]);
//    }
    j = 1;
    for(int i = c-1;i >= 0;i--)
    {
        renumber = str[i] * j + renumber;
        j = j * 10;
    }
    if(flags)
    {
        return renumber;
    }
    else
    {
        return -renumber;
    }
}

错误:

Input: 1534236469
Output: 1056389759
Expected: 0

原因:我一开始的想法是将整数转化为字符串,然后将字符串倒转过来,再组成整数即可,但是整数转化为字符串的代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int s[10];
    int n,j=1,i=0,c=0;
    scanf ("%d",&n);
    while(n/j!=0)
    {
        s[i]=n/j-(n/(j*10))*10;
        j=j*10;
        i++;
        c++;
    }
    for(i=c-1; i>=0; i--)
    {
        if(i!=0)
            printf("%d ",s[i]);
        else printf("%d",s[i]);
    }
    return 0;
}

仅适用于输入的整数位数小于10位
第四次提交

int reverse(int x)
{
    int max = 2147483647;
    int min = -2147483648;
    if(x == 0)
    {
        return 0;
    }
    int result = 0;
    while(x != 0)
    {
        if(result > max / 10 || result < min / 10)
            return 0;
        result = result * 10 + x % 10;
        x = x / 10;
    }
    return result;
}

反思:
1 在输入部分不需要判断溢出值

    if(x < (-2147483648) || x >(2147483647))  //边界值
    {
        printf("%d",x);
        return 0;
    }

这段代码是没用必要的,因为x是int类型,所以x值的范围肯定不能大于2147483647或者小于-2147483648。
2 输入的值要判断边界范围,输出的值也要判断范围。
3 整数的翻转和字符串的翻转有相同之处,也有不同之处,整数的翻转可以通过计算进行。
4 这种数值计算题,假如遇到的话,要跟面试官详细讨论边界条件,溢出应该怎么做.
参考资料:
1 https://blog.csdn.net/xuchonghao/article/details/78944586
2https://www.cnblogs.com/yrbbest/p/4430339.html

posted @ 2019-03-04 16:00  尚修能的技术博客  阅读(1037)  评论(0编辑  收藏  举报