刷题笔记

【leetcode刷题笔记】007.Reverse Intege

2018-09-13  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读