美文网首页刷题笔记
【leetcode刷题笔记】007.Reverse Intege

【leetcode刷题笔记】007.Reverse Intege

作者: 常恒毅 | 来源:发表于2018-09-13 00:39 被阅读0次
    日期:20180912
    题目描述:

    Given a 32-bit signed integer, reverse digits of an integer.

    Example 1:
    Input: 123
    Output: 321
    
    Example 2:
    Input: -123
    Output: -321
    
    Example 3:
    Input: 120
    Output: 21
    
    详解:

    这道题目乍一看很简单,但是'32-bit signed'正是出题人的陷阱,首先要考虑输出是否依然是在'32-bit signed'范围内,也就是[-231,231-1],也就是[-2147483648,2147483647],由题可知输入肯定是合法的,关键是反转后的输出是否合法,如果不合法按照题目的意思应该输出0。

    class Solution {
    public:
        int reverse(int x) {
            bool isNeg = false;
            long long int y=0;
            if(x<0){
                isNeg = true;
                x = -x;
            }
            while(x){
                y = y*10 + x%10;
                x /= 10;
            }
            if(y>2147483647||y<-2147483648)
                    return 0;
            int tmp = y;
            if(isNeg){
                tmp = -tmp;
            }
            return tmp;  
        }
    };
    

    在此复习一下整数:

    C类型 32位机器 64位机器
    char 1字节 1字节
    short int 2字节 2字节
    int 4字节 4字节
    long int 4字节 8字节
    long long int 8字节 8字节
    char* 4字节 8字节
    float 4字节 4字节
    double 8字节 8字节

    一开始用了long int,后来发现一点变化都没有,应该是因为编译器按32位编译的。使用了long long int之后就顺利通过了。

    另外,计算机中储存数据使用补码,对于非负数:

    补码 = 原码
    

    对于负数:

    补码 = 反码 + 1
    

    例如对于4位int,-1的原码是1000 0000 0000 0000 0000 0000 0000 0001,反码是1111 1111 1111 1111 1111 1111 1111 1110,补码是 1111 1111 1111 1111 1111 1111 1111 1111。也就是0xFFFFFFFF。而-231的原码无法表示,根据连续性补码0x80000000的值就为-231

    相关文章

      网友评论

        本文标题:【leetcode刷题笔记】007.Reverse Intege

        本文链接:https://www.haomeiwen.com/subject/seeigftx.html