【leecode刷题】中级算法-数学

1、快乐树

在这里插入图片描述

class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        # def cal(n):
        #     if n==1:
        #         return True
        #     n = sum([int(math.pow(int(i),2)) for i in str(n)])
        #     return cal(n) 
        # try:
        #     return cal(n)
        # except Exception as e:
        #     print(e)
        def get_next(n):
            total_sum = 0
            while n > 0:
                n, digit = divmod(n, 10)
                total_sum += digit ** 2
            return total_sum

        seen = set()
        while n != 1 and n not in seen:
            seen.add(n)
            n = get_next(n)

        return n == 1

2、阶乘后的零

在这里插入图片描述

class Solution(object):
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
        # def cal(n):
        #     if n==1:
        #         return 1
        #     return(cal(n-1)*n)
        # if n<=0:
        #     return 0
        # else:
        #     number = cal(n)        
        # count=0
        # flag = True
        # while number>=0 and flag:
        #     if number%10==0:
        #         count=count+1
        #         number=number//10
        #     else:
        #         flag=False
        # return count
        zero_count = 0
        while n > 0:
            n //= 5
            zero_count += n
        return zero_count

3、Excel表列序号

在这里插入图片描述

class Solution(object):
    def titleToNumber(self, s):
        """
        :type s: str
        :rtype: int
        """
        import math
        alpha = {}
        k = 1
        for i in range(65,91):
            alpha[chr(i)] = k
            k = k+1
        zhishu = len(s)-1
        result = 0
        for i in s:
            result = result+math.pow(26,zhishu)*alpha[i]
            zhishu = zhishu-1
        return int(result)

4、两数相除

在这里插入图片描述

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """

        # if dividend<0 and divisor>0:
        #     dividend = -dividend
        #     sign = "-"
        # elif divisor<0 and divisor>0:
        #     divisor = -divisor
        #     sign = "-"       
        # else:
        #     sign = ""
        # return sign+str(int(dividend/divisor))
        # res = 0
        # sign =  1 if divd ^ dior >= 0 else -1
        # divd = abs(divd)
        # dior = abs(dior)
        # while divd >= dior:
        #     res += 1
        #     divd -= dior
        # res = res*sign 
        # return min(max(-2**31, res), 2**31-1)
        # if dividend == 0:
        #     return 0
        # if (dividend < 0 and divisor > 0) or (dividend > 0 and divisor < 0):
        #     f = '-'
        # else:
        #     f = ''
        # dividend = dividend if dividend > 0 else 0 - dividend
        # divisor = divisor if divisor > 0 else 0 - divisor
        # t = divisor
        # i = 1
        # dList = [0]
        # while dividend >= t:
        #     dividend -= t
        #     dList.append(i)
        #     t += divisor
        #     i += 1
        # if dividend < divisor:
        #     return max(min(int(f + str(sum(dList))), (1 << 31) -1), -1 << 31)
        # else:
        #     while dividend < t:
        #         t -= divisor
        #         i -= 1
        #     dList.append(i)
        #     return max(min(int(f + str(sum(dList))), (1 << 31) -1), -1 << 31)
        def recursion(dividend, divisor):
            if dividend < divisor:
                return 0
            if dividend == divisor:
                return 1
            nn = 1
            dd = divisor
            while True:
                if dividend > dd:
                    n = nn
                    nn += nn
                    d = dd
                    dd += dd
                elif dividend == dd:
                    return nn
                else:
                    return n + recursion(dividend - d, divisor)

        if dividend >= 0:
            if divisor > 0:
                positive = True
            else:
                positive = False
        else:
            if divisor > 0:
                positive = False
            else:
                positive = True
        ans = recursion(abs(dividend), abs(divisor))
        if positive:
            if ans > 2 ** 31 - 1:
                return 2 ** 31 - 1
            else:
                return ans
        else:
            return -ans

5、分数变小数

在这里插入图片描述

class Solution(object):
    def fractionToDecimal(self, numerator, denominator):
        """
        :type numerator: int
        :type denominator: int
        :rtype: str
        """
        if denominator < 0 and numerator > 0:
            denominator = -denominator
            sign = "-"
        elif numerator < 0 and denominator > 0:
            numerator = -numerator
            sign = "-"
        else:
            sign = ""
        precision = 1000
        pos = 0
        modDict = {}
        frac = []
        is_circulator = False  # 是否存在循环

        div, mod = divmod(numerator, denominator)
        intPart = sign + str(div)

        # 模拟手算的过程,发现有相同的余数就说明发现循环
        while pos < precision and mod != 0:
            modDict[mod] = pos
            mod *= 10
            div, mod = divmod(mod, denominator)
            frac.append(str(div))
            if mod in modDict.keys():
                is_circulator = True
                break
            pos += 1

        if is_circulator:  # 发现循环 
            frac.insert(modDict[mod], '(')
            frac.append(')')
        return intPart + '.' + ''.join(frac) if len(frac) > 0 else intPart
对于LeetCode刷题,我可以提供一些指导和建议。LeetCode是一个非常受欢迎的在线编程平台,提供了大量的编程题目,涵盖各种算法和数据结构的知识点。 要有效地刷LeetCode题目,以下是一些建议: 1. 熟悉常见的数据结构和算法:在开始刷题之前,你需要对常见的数据结构(如数组、链表、栈、队列、树等)和算法(如排序、查找、递归、动态规划等)有一定的了解。 2. 刷题顺序:可以按照题目的难度或者类型进行刷题。刚开始可以选择一些简单的题目,逐渐提升到中等和困难难度的题目。另外,可以按照题目类型进行分类刷题,比如数组、链表、树等。 3. 题目分析:在开始解题之前,仔细阅读题目,并理解问题的要求。可以考虑一些边界情况和特殊情况。 4. 设计合适的解决方案:根据题目要求,设计出符合要求的解决方案。可以先在纸上画图或者写伪代码,再实现代码。 5. 编写高质量的代码:编写代码时,注意代码的可读性、可维护性和效率。可以考虑使用适当的数据结构和算法来优化代码。 6. 调试和测试:编写完代码后,进行调试和测试,确保代码能够正确地解决问题。 7. 多解法比较:对于一道题目,可以尝试不同的解法,比较它们的优劣,并分析其时间复杂度和空间复杂度。 8. 学习他人的解法:在刷题过程中,可以参考他人的解题思路和代码,并学习其中的优秀之处。 9. 刷题计划:可以制定一个刷题计划,每天或每周刷一定数量的题目,并坚持下去。 10. 总结和复习:在刷题过程中,及时总结自己的思考和解题过程,对于一些常见的算法和技巧进行复习和加深理解。 希望以上的建议对你有所帮助。祝你在LeetCode刷题中取得好成绩!如果你有其他问题,也欢迎继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值