daily-algorithms
                                
                                
                                
                                    daily-algorithms copied to clipboard
                            
                            
                            
                        Reverse Integer
本题难度:★
将一个 32-bit 无符号整数的所有数字倒序,输出一个新的整数,如
eg1. x = 123, return 321
eg2. x = -123, return -321
提示:
- 考虑末尾为零的情况,如 10, 100
 - 考虑溢出情况,如将 1000000003 倒序排列
 
溢出则输出 0.
参考答案:https://github.com/barretlee/daily-algorithms/blob/master/answers/2.md
这题出得很好~👍 平常前端页面切多了,这些计算机基础我都差不多忘光了,正好补补。
int32位的数的大小范围为 -2^31~2^31-1
该题的思路可以利用转换为数组的形式,在用数组反转和拼接,在转换成数字的方法来做
function reverse (number) {
    const min = - ((1 << 30) * 2);
    const max = (1 << 30) * 2 - 1;
    let result;
    const numberArr = number.toString().split('');
    if(number < 0) {
        numberArr.shift();
    }
    result = Number(numberArr.reverse().join(''));
    if(number < 0) {
        result *= -1;
    }
    if(result < min || result > max) {
        result = 0;
    }
    return result;
}
                                    
                                    
                                    
                                
顺便补充点数据机器级的表示方法的概略,主要的大家可以自行查找一些资料
- 
后缀字母标识该数的进位记数制
- B表示二进制
 - O表示八进制
 - D表示十进制
 - H表示十六进制
 
 - 
定点数,小数点位置约定在固定位置的数称为定点数
 - 
浮点数,小数点位置约定为可浮动的数称为浮点数
 - 
定点小数,其小数点总是固定在数的最左边,一般涌来表示浮点数的尾数部分。
 - 
定点整数,其小数点总是固定在数的最右边。
 - 
浮点表示,任意一个二进制数X,可以表示成如下形式
X=(-1)^s*M*R^Es取0或1,用来表示X的符号,M是一个二进制定点小数,称为X的尾数,E是一个二进制定点整数,称为数X的阶或指数,R是基数,可以取值2、4、8等。
 - 
原码表示法,一个数的原码表示由符号位直接后跟数值位构成。正数和负数的编码表示仅符号位不同,数值部分完全相同。优点,与真值的对应关系直观、方便。但是0的表示不唯一
 - 
补码表示法,由符号位后跟真值的膜2^n补码构成。正数的补码是它本身,负数的补码等于模与该负数的绝对值之差。
[XT]补=M+XT(mod M)快速计算方法,符号位不变,真值部分“各位取反,末位+1” - 
反码表示法,符号位不变,其余真值部分取反
 - 
移码表示法,设E为指数,其移码表示位数为n,则[E]移=2^(n-1) + E(这里的2^(n-1)为偏置常数)
 - 
实数的表示
X=(-1)^s*M*R^E- IBM370格式,基数R为16
 
数符0 阶码(1-7) 尾数(8-31)  - 
对浮点数的尾数的规格化,除了能得到尽量多的有效数位意外,还可以使浮点数的表示具有唯一性
 - 
IEEE754浮点数标准: 32位单精度格式中包含1位符号s、8位阶码e和23位尾数f;64位双精度个市包含1位符号s、11位阶码e、52位尾数f。其基数隐含为2;尾数用原码表示,第一位总为1,因而可在尾数中省略第一位的1,称为隐藏位,使得单精度格式的23位尾数实际上表示了24位有效数字,52位尾数实际上表示了53位有效数字。尾数带一个隐藏位,偏置常数用2^(n-1)-1的做法
 - 
字长等于CPU内部用于证书运算的运算器位数和通用寄存器的宽度
 - 
字用来表示被处理信息的单位,用来度量各种数据类型的宽度
 - 
最低有效位LSB,最高有效位MSB
 - 
根据数据中各字节在连续字节序列中的排列顺序的不同,可有两种排列方式
- 大端,将数据的最高有效字节MSB存放在低地址单元中,将最有效字节LSB存放在高地址单元中,即数据的地址就是MSB所在的地址
 - 小端,将数据的最高有效字节MSB存放在高地址中,将最低有效字节LSB存放在高地址单元中,即数据的地址就是MSB所在的地址
 
 
@wangning0 如果溢出的话,你的程序是不是已经存在问题了?
Number(numberArr.reverse().join('')) 这里已经是溢出的结果了吧...
而且好像并没有考虑末尾是 0 的情况?
@barretlee 因为是已经转换成了字符串了这个的话 是不存在溢出的说法的,如果是在Number中的话,因为在JS当中的话 所有的数实际存储都是8个字节的,32bit只是4个字节,还差的很远,所以根据题目的条件是假设4个字节溢出的话,那么就在后面通过数值比较来实现是否判它为0了
32-bit 无符号整数范围应该是 0 --- 2^32 - 1 吧 维基
这样子貌似可以:
import sys
def reverse(x):
    res = 0
    flag = lambda x:x<0
    flag = flag(x)
    x = abs( x )
    while 1:
        if x == 0:
            break
        if res > sys.maxint/10 :
            return 0
        res = res * 10 + x % 10
        x = x/10
    if(flag):
        return -res
    else:
        return res
      
print("123",reverse(123))
print("-123",reverse(-123))
print("100",reverse(100))
print("1000000003",reverse(1000000003))
                                    
                                    
                                    
                                
题目不是无符号数吗?表示范围:0 --- 2^32 - 1,使用位运算肯定丢失精度了。