• 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

  • 相关阅读:
    windows server2012之部署HTTPS安全站点
    HTTPS站点搭建教程:Win7/Windows Server 2008R2
    https,https的本地测试环境搭建,asp.net结合https的代码实现,http网站转换成https网站之后遇到的问题
    SQL Server中解决死锁的新方法介绍
    WCF寄宿到Windows Service[1]
    安装程序工具 (Installutil.exe)22
    安装程序工具 (Installutil.exe)
    WebSocket使用教程
    深入理解java String 对象的不可变性
    Android 给Button加个监听
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/10469134.html
Copyright © 2020-2023  润新知