leetcode刷题记录05——整数反转(Java和JavaScript)

7. 整数反转

难度:简单

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
 

这个题目我先自己做的,没看题解,思路比较复杂,利用JavaScript的数字型和字符串型相互转化然后判断是否溢出来解题的

JavaScript答案如下(只超过了6%的答案( ´▽`))

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    var s=x+"";
    var res="";
    if(x<0){
        for(var i=s.length-1;i>0;i--){
            res+=s[i];
        }
        console.log(res);
        
        var k=0;
        if(res[0]=="0"){
        while(res[k]=="0"){
            k++;
        }
        }else{
            k=0;
        }
        res="-"+res.substring(k);
        console.log(res);
        var d=parseInt(res);
        console.log(d);

        if(d+""!==res||d>Math.pow(2,31)-1||d=0;i--){
            res+=s[i];
        }
         console.log(res);
        var k=0;
         if(res[0]=="0"){
        while(res[k]=="0"){
            k++;
        }
        }else{
            k=0;
        }
        res=res.substring(k);
         console.log(res);
        var d=parseInt(res);
          console.log(d);

        if(d+""!==res||d>Math.pow(2,31)-1||d

 

后来看了题解,发现题解的代码特别少,

标签:数学
本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换加try catch的方式来解决,第二个思路就是通过数学计算来解决。
由于字符串转换的效率较低且使用较多库函数,所以解题方案不考虑该方法,而是通过数学计算来解决。
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。
溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。
从ans * 10 + pop > MAX_VALUE这个溢出条件来看
当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2^31 - 1的个位数
从ans * 10 + pop < MIN_VALUE这个溢出条件来看
当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans == MIN_VALUE / 10 且 pop < -8 时,则一定溢出,8是-2^31的个位数
链接:https://leetcode-cn.com/problems/reverse-integer/solution/hua-jie-suan-fa-7-zheng-shu-fan-zhuan-by-guanpengc/
来源:力扣(LeetCode)
 

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            int pop = x % 10;
            if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7)) 
                return 0;
            if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8)) 
                return 0;
            ans = ans * 10 + pop;
            x /= 10;
        }
        return ans;
    }
}

。

 

你可能感兴趣的:(leetcode,leetcode)