力扣每日一题(四十九——阶乘后的零)

仅以此纪录每日LeetCode所刷题目。

题目描述:

示例:

 

思路:

这道题我当时的思路是得到n的阶乘res,将res由数字转化成字符,之后将res字符翻转,遍历res的各个字符,当遇到字符不是str(0)时停止,得到答案。但是这个方法的时间和空间都占用的比较多。

另外的思路就是求阶乘中5的因子的个数。末尾0其实是任意正整数乘以10产生的,也就是说因子中每出现一个2和一个5,结果就会多一个末尾0。显然连续数字的阶乘里,2的因子个数是远远多于5的因子个数的。那么主要影响末尾0的个数其实是5的因子个数。同时,我们要注意5*5=25、5*5*5=125等等,有的数的因子含有多个五,因此这些数要额外的讨论进去。

代码:

class Solution:
    def trailingZeroes(self, n: int) -> int:
        if n == 0:
            return 0
        res = 1
        for i in range(1,n+1):
            res *= i
        res = str(res)[::-1]
        for i in range(len(res)):
            if res[i] != '0':
                return i
class Solution:
    def trailingZeroes(self, n: int) -> int:
        count = 0
        # if n < 5:
        #     return 0
        for i in range(5,n+1,5):
            while i % 5 == 0:
                i //= 5
                count += 1
        return count

 

题目描述:

示例:

 

思路:

这道题可以直接使用模拟的方法,依次判断ops中的每个字符相对的要求。因为题目中明确说明了

  • 对于 "+" 操作,题目数据保证记录此操作时前面总是存在两个有效的分数
  • 对于 "C" 和 "D" 操作,题目数据保证记录此操作时前面总是存在一个有效的分数

也就简化了我们对这道题的一些判断,放心大胆的模拟即可。

代码:

class Solution:
    def calPoints(self, ops: List[str]) -> int:
        list1 = []
        for i in ops:
            if i == 'C':
                list1.pop()
                continue
            if i == 'D':
                list1.append(list1[-1]*2)
                continue
            if i == '+':
                list1.append(list1[-1]+list1[-2])
                continue
            list1.append(int(i))
        count = 0 
        for i in list1:
            count += i
        return count

题目描述:

示例:

 

思路:

题目中明确说明了每一行从左到右递增,因此我们可以首先遍历每一行,看看target是否在这一行中(只需要和这一行的第一个数字以及最后一个数字作比较即可)。确定数字的大小符合这一行的范围时,我们重新遍历这一行即可。

当然这道题还有更简单的做法,我们将这个二维数组向翻转45度,我们会发现其实这是一个二叉搜索树。我们来看一张图(来自Krahets)。

我们可以通过变换行索引来向左移动,来改变列索引向右移动,同时利用二叉搜索树的性质来求解。

代码:

class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        if matrix == []:
            return False
        row = len(matrix)
        col = len(matrix[0])
        if row == 0 or col == 0:
            return False
        for i in range(row):
            if matrix[i][0] <= target <= matrix[i][-1]:
                for j in matrix[i]:
                    if j == target:
                        return True
        return False
class Solution:
    def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool:
        i, j = len(matrix) - 1, 0
        while i >= 0 and j < len(matrix[0]):
            if matrix[i][j] > target: i -= 1
            elif matrix[i][j] < target: j += 1
            else: return True
        return False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值