leetcode刷题记录之7

7、整数反转

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

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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

难度:简单  题目地址:https://leetcode-cn.com/problems/reverse-integer/

1、C语言代码:

int reverse(int x){
    long res = 0;
        while(x != 0){
            res = res * 10 + x % 10; 
             if (res > INT_MAX || res < INT_MIN) {
                return 0;
            }
            x /= 10;          
    }
    return res;
}

解释: 直接倒序翻转x,判断res是否溢出,如果溢出直接返回0。

知识点回顾: INT_MAX和INT_MIN表示C语言中int的上下限,在标准头文件limits.h中定义。

2、Java代码:

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

解释: 方法:弹出和推入数字 & 溢出前进行检查,我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。
反转整数的方法可以与反转字符串进行类比。我们想重复“弹出” xxx 的最后一位数字,并将它“推入”到 rev的后面。最后,rev 将与 xxx 相反。要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。
但是,这种方法很危险,因为当 temp=rev*10+pop 时会导致溢出。
幸运的是,事先检查这个语句是否会导致溢出很容易。
为了便于解释,我们假设 rev 是正数。
如果 temp=rev*10+pop 导致溢出,那么一定有 rev≥INTMAX​/10。
如果 rev>INTMAX/10​,那么 temp=rev*10+pop一定会溢出。
如果 rev==INTMAX/10,那么只要 pop>7,temp=rev*10+pop 就会溢出。
当 rev为负时可以应用类似的逻辑。

知识点回顾: 判断溢出的方法。

3、Python代码:

class Solution:
    def reverse(self, x: int) -> int:
        flag = -1 if x < 0  else 1
        res = flag * int(str(abs(x))[::-1])
        return res if (-2**31)<=res<=(2**31-1) else 0

解释: 利用切片进行反转,加上了对溢出的判断。

知识点回顾: 数字类型之间的转化,切片的使用。判断溢出的方法。数值对象不可能之间用切片。

4、JavaScript代码:

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
    var re = 0;
    while (parseInt(x / 10)) {
        re = 10 * re + x - 10 * parseInt(x / 10);
        x = parseInt(x / 10);
    }
    if (re > 214748364 || re < -214748364) return 0;
    if ((re == 214748364 && x > 7) || (re == 214748364 && x < -8)) return 0;
    re = 10 * re + x;
    return re
};

解释: 类似于Java求解的思路。

知识点回顾:
1、parseInt() 函数可解析一个字符串,并返回一个整数。
语法:parseInt(string, radix)
string:必需。要被解析的字符串。
radix:可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
返回值:返回解析后的数字。
说明:当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
  举例,如果 string 以 “0x” 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

你可能感兴趣的:(算法刷题)