LeetCode腾讯精选50题---7,8,9

Day02

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

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

    示例 1:
    输入:x = 123
    输出:321

    示例 2:
    输入:x = -123
    输出:-321

    示例 3:
    输入:x = 120
    输出:21

    示例 4:
    输入:x = 0
    输出:0


    提示:
    -2^31 <= x <= 2^31 - 1
"""


class Solution_baoli(object):
    # 暴力解法,直接把x转化为str进行切片操作
    def reverse(self, x: int) -> int:
        """
        :type x: int
        :rtype: int
        """

        s = str(x)

        if s[0] != "-":
            s = s[::-1]
            x = int(s)
        else:
            s = s[:0:-1]
            x = int(s)
            x = -x
        return x if -2147483648 < x < 2147483647 else 0
8. 字符串转换整数 (atoi) (Medium)
"""
    请你来实现一个atoi函数,使其能将字符串转换成整数。

    首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:

    如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
    假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
    该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。

    假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换,即无法进行有效转换。
    在任何情况下,若函数不能进行有效的转换时,请返回 0 。

    注意:
    本题中的空白字符只包括空格字符 ' ' 。
    假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为[−2^31,2^31 − 1]。如果数值超过这个范围,请返回−2^31 - 1 或 −2^31 。

    示例1:
    输入: "42"
    输出: 42

    示例2:
    输入: "   -42"
    输出: -42
    解释: 第一个非空白字符为 '-', 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

    示例3:
    输入: "4193 with words"
    输出: 4193
    解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

    示例4:
    输入: "words and 987"
    输出: 0
    解释: 第一个非空字符是 'w', 但它不是数字或正、负号。因此无法执行有效的转换。

    示例5:
    输入: "-91283472332"
    输出: -2147483648
    解释: 数字 "-91283472332" 超过 32 位有符号整数范围。因此返回 INT_MIN (−231) 。

    提示:
    0 <= s.length <= 200
    s 由英文字母(大写和小写)、数字、' '、'+'、'-' 和 '.' 组成
"""
from builtins import str
import re


class Solution(object):
    # 思路:循环遍历字符串,直到无法强制转换int
    def myAtoi(self, s: str) -> int:
        """
        :type s: str
        :rtype: int
        """
        # 去除左边空字符
        s = s.lstrip()
        # 判断此时字符串长度,若为0则返回0
        if len(s) == 0:
            return 0

        res = 0
        # 如果有符号设置起始位置1,其余的为0
        i = 1 if s[0] == "-" or s[0] == "+" else 0
        # 循环直到无法强制转换
        while i <= len(s):
            try:
                res = int(s[:i+1])
                i += 1
            except:
                break
        if res > 2147483647:
            return 2147483647
        if res < -2147483648:
            return -2147483648

        return res


class Solution_re(object):
    # 思路:正则
    """
        ^:匹配字符串开头
        [\+\-]:代表一个+字符或-字符
        ?:前面一个字符可有可无
        \d:一个数字
        +:前面一个字符的一个或多个
        \D:一个非数字字符
        *:前面一个字符的0个或多个
    """
    
    def myAtoi(self, s: str) -> int:
        """
        :type s: str
        :rtype: int
        """
        # 去除左边空字符
        s = s.lstrip()
        # 设置正则规则并查找匹配的内容
        res_re = re.findall(r'^[\+\-]?\d+', s)
        # 因为res_re的是个列表,解包并且转换成整数
        res = int(*res_re)
        return max(min(res, 2147483648), -2147483648)
9. 回文数 (Easy)
  • 9. 回文数 (Easy)
    思路:
    • 转化字符串:直接暴力、双指针遍历
    • 不转化字符串:数学方法
"""
    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    示例 1:
    输入: 121
    输出: true

    示例2:
    输入: -121
    输出: false
    解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

    示例 3:
    输入: 10
    输出: false
    解释: 从右向左读, 为 01 。因此它不是一个回文数。

    进阶:
    你能不将整数转为字符串来解决这个问题吗?

"""


class Solution(object):
    # 直接暴力
    def isPalindrome(self, x: int) -> bool:
        """
        :type x: int
        :rtype: bool
        """

        # x = str(x)
        # if x == x[::-1]:
        #     return True
        # else:
        #     return False
        return str(x) == str(x)[::-1]


class Solution_Double_Pointer(object):
    # 双指针
    def isPalindrome(self, x: int) -> bool:
        """
        :type x: int
        :rtype: bool
        """
        x = str(x)
        left, right = 0, len(x) -1
        while left <= right:
            if x[left] != x[right]:
                return False
            left += 1
            right -= 1
        return True


class Solution_Math(object):
    # 数学方法
    def isPalindrome(self, x: int) -> bool:
        # 判断如果x小于0或者x能被10整除但不是0,返回False
        if x < 0 or (x % 10 == 0 and x != 0):
            return False

        # 然后就是把一个数字前后对称位数字构造出来,x是前,res是后
        # 因为x可能是偶数位数字或者奇数位数字,如果是偶数位数字,则res==x,res==x代表回文数,如果是奇数位数字,则中间那个数字不考虑,考虑x==res//10,x==res//10代表回文数
        res = 0
        while x > res:
            res = res * 10 + x % 10
            x = x // 10

        return res == x or x == res // 10

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值