力扣1447. 最简分数
解题思路:题目要求返回0到1之间满足分母小于等于n的最简分数。由于列表是从小到大进行遍历,可以使用哈希表或者是字典的key来存放分子/分母的结果,这样在1/2之后的2/4进来,求得两者结果相同,只保留1/2,以达到去重的效果。在检查时,只需要检查商是否存在即可,如果不存在,添加结果到最终结果res列表中。边界条件就是当n=1时永远为1,找不到最简分数则返回空列表。
from typing import List
def simplifiedFractions(n: int) -> List[str]:
dic = {} # 用字典去重,分子除以分母的值作为唯一key
res = [] # 存放结果
if n == 1: # 如果整数是1,结果为空
return []
for mum in range(2, n+1): # 分母从2开始
son = 1 # 分子从1开始
while son < mum:
a = son / mum
if a not in dic and 0 < a < 1:
res.append(str(son) + '/' + str(mum))
dic[a] = 1
son += 1
return res
n = 4
print(simplifiedFractions(n)) # ['1/2', '1/3', '2/3', '1/4', '3/4']
另外可以使用python的math模块gcd函数,如果gcd(x, y) == 1,即x和y的最大公约数为1,则x/y是最简分数。
from math import gcd
def math_solution(n: int) -> List[str]:
res = []
for i in range(n+1):
for j in range(1, i):
if gcd(j, i) == 1:
res.append(str(j) + '/' + str(i))
return res
END