daily-algorithms icon indicating copy to clipboard operation
daily-algorithms copied to clipboard

Reverse Integer

Open barretlee opened this issue 8 years ago • 8 comments

本题难度:★

将一个 32-bit 无符号整数的所有数字倒序,输出一个新的整数,如

eg1. x = 123, return 321
eg2. x = -123, return -321

提示:

  1. 考虑末尾为零的情况,如 10, 100
  2. 考虑溢出情况,如将 1000000003 倒序排列

溢出则输出 0.

参考答案:https://github.com/barretlee/daily-algorithms/blob/master/answers/2.md

barretlee avatar Jun 28 '17 02:06 barretlee

这题出得很好~👍 平常前端页面切多了,这些计算机基础我都差不多忘光了,正好补补。

youngwind avatar Jun 28 '17 03:06 youngwind

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;
}

wangning0 avatar Jun 28 '17 03:06 wangning0

顺便补充点数据机器级的表示方法的概略,主要的大家可以自行查找一些资料

  • 后缀字母标识该数的进位记数制

    • B表示二进制
    • O表示八进制
    • D表示十进制
    • H表示十六进制
  • 定点数,小数点位置约定在固定位置的数称为定点数

  • 浮点数,小数点位置约定为可浮动的数称为浮点数

  • 定点小数,其小数点总是固定在数的最左边,一般涌来表示浮点数的尾数部分。

  • 定点整数,其小数点总是固定在数的最右边。

  • 浮点表示,任意一个二进制数X,可以表示成如下形式

    X=(-1)^s*M*R^E

    s取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 avatar Jun 28 '17 04:06 wangning0

@wangning0 如果溢出的话,你的程序是不是已经存在问题了?

Number(numberArr.reverse().join('')) 这里已经是溢出的结果了吧... 而且好像并没有考虑末尾是 0 的情况?

barretlee avatar Jun 28 '17 04:06 barretlee

@barretlee 因为是已经转换成了字符串了这个的话 是不存在溢出的说法的,如果是在Number中的话,因为在JS当中的话 所有的数实际存储都是8个字节的,32bit只是4个字节,还差的很远,所以根据题目的条件是假设4个字节溢出的话,那么就在后面通过数值比较来实现是否判它为0了

wangning0 avatar Jun 28 '17 04:06 wangning0

32-bit 无符号整数范围应该是 0 --- 2^32 - 1 吧 维基

Min-field avatar Jun 28 '17 10:06 Min-field

这样子貌似可以:

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))

pengkobe avatar Jun 29 '17 01:06 pengkobe

题目不是无符号数吗?表示范围:0 --- 2^32 - 1,使用位运算肯定丢失精度了。

justjavac avatar Jul 03 '17 02:07 justjavac