算法题目整理分析--整数反转

题目如下

方法一:通过数组反转

这是首先想到的方法,先将符号提出来,将字符转成数组,然后反转拼接,然后再将符号拼上去。最后判断是否在范围之内

var reverse = function(x) {
    var str = x + ''
    var keepSymble = ''
    var reverseStr = ''
    var area =  [-Math.pow(2, 31),  Math.pow(2, 31) - 1]
    var result = getResult()

    return isInArea(result) ? result : 0

    // 计算结果
    function getResult() {
        str.replace(/(^-)(\d+)/, function ($0, $1, $2) {
            if ($1) {
                keepSymble = $1
                str = $2
            }
        })
    reverseStr =  str.split('').reverse().join('')
        return parseInt(keepSymble + reverseStr)
    }
    // 判断是否在范围之内
    function isInArea(result) {
        return area[0] < result && area[1] > result
    }
};

思路没问题,结果没问题,但是好像不是题目想要的方式。

方法二:

遍历一次,每次前进一位,最后拿到结果

这个相对来说就有点意思了,

var reverse = function(x) {
    var max = Math.pow(2, 31) - 1;
    var min = -Math.pow(2, 31);
    var y = 0;
    while(x !== 0) {
        y = 10 * y + x % 10;
        x = ~~(x/10);
    }
    if (y > max) return 0;
    if (y < min) return 0; return y; }; 

~~解释:将变量转成Number

将类似于布尔类型不同类型转换成 0/1

~~false === 0
~~true === 1
~~undefined === 0
~~!undefined === 1
~~null === 0
~~!null === 1  
~~"" === 0
~~!"" === 1

数字转化时,小数点忽略,正负号保留

    // 小数点忽略
~~123.33 === 123
    // 正负号保留
~~-123 === -123

将字符串转成数字

    // 直接转成数字
    ~~'123' === 123
    // 小数直接忽略
    ~~'123.22' === 123

随机浏览