0209leetcode刷题5道python

剑指offer60

题目描述:
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。

示例:
0209leetcode刷题5道python_第1张图片
解答:

class Solution:
    def dicesProbability(self, n: int) -> List[float]:
        dp = [ [0 for _ in range(6*n+1)] for _ in range(n+1)]
        for i in range(1,7):
            dp[1][i] = 1

        for i in range(2,n+1):
            for j in range(i,i*6+1):
                for k in range(1,7):
                    if j >= k+1:
                        dp[i][j] +=dp[i-1][j-k]
        res = []
        for i in range(n,n*6+1):
            res.append(dp[n][i]*1.0/6**n)
        return res

剑指offer61

题目描述:
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例:
0209leetcode刷题5道python_第2张图片
解答:

class Solution:
    def isStraight(self, nums: List[int]) -> bool:
        nums.sort()
        numZeros=nums.count(0)
        if len(set(nums[numZeros:]))<len(nums[numZeros:]):
            return False
        return nums[-1]-nums[numZeros]<=4

剑指offer62

题目描述:
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例:
0209leetcode刷题5道python_第3张图片
解答:

class Solution:
    def lastRemaining(self, n: int, m: int) -> int:
        if n<1 or m<0:
            return -1
        last=0
        for i in range(2,n+1):
            last=(last+m)%i
        return last

剑指offer65

题目描述:
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

示例:
0209leetcode刷题5道python_第4张图片
解答:

class Solution:
    def add(self, a: int, b: int) -> int:
        while b:
            result = (a ^ b) & 0xffffffff
            carry = ((a & b) << 1) & 0xffffffff
            a = result
            b = carry
        if a <= 0x7fffffff:
            result = a
        else:
            result = -((a - 1) ^ 0xffffffff)
        return result  

剑指offer67

题目描述:
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。

示例:
0209leetcode刷题5道python_第5张图片
解答:

class Solution:
    def strToInt(self, str: str) -> int:
        str = str.strip()                      # 删除首尾空格
        if not str: 
            return 0                   # 字符串为空则直接返回
        res, i, sign = 0, 1, 1
        int_max, int_min, bndry = 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10
        if str[0] == '-': 
            sign = -1            # 保存负号
        elif str[0] != '+': 
            i = 0              # 若无符号位,则需从 i = 0 开始数字拼接
        for c in str[i:]:
            if not '0' <= c <= '9' : 
                break     # 遇到非数字的字符则跳出
            if res > bndry or res == bndry and c > '7': 
                return int_max if sign == 1 else int_min # 数字越界处理
            res = 10 * res + ord(c) - ord('0') # 数字拼接
        return sign * res


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