仅以此纪录每日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