最简分数
难度:
标签:
题目描述
代码结果
运行时间: 48 ms, 内存: 16.5 MB
/*
* 思路:
* 1. 使用Java Stream API处理所有可能的分数。
* 2. 使用嵌套循环生成所有可能的分数并转换为流。
* 3. 过滤掉不是最简分数的分数(使用GCD判断分子和分母是否互质)。
* 4. 将结果收集为一个列表。
*/
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SimplifiedFractionsStream {
public List<String> simplifiedFractions(int n) {
return IntStream.rangeClosed(2, n)
.boxed()
.flatMap(denominator -> IntStream.range(1, denominator)
.filter(numerator -> gcd(numerator, denominator) == 1)
.mapToObj(numerator -> numerator + "/" + denominator))
.collect(Collectors.toList());
}
private int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static void main(String[] args) {
SimplifiedFractionsStream sf = new SimplifiedFractionsStream();
System.out.println(sf.simplifiedFractions(4)); // 示例输出
}
}
解释
方法:
该题解使用了列表推导来构建所有可能的最简分数。对于每个分母denominator从2到n,尝试每个分子numerator从1到denominator-1。通过使用gcd函数(最大公约数函数)检查分子和分母是否互质(gcd等于1),来确定分数是否最简。只有当gcd(denominator, numerator)为1时,分数'numerator/denominator'才是最简分数并被添加到结果列表中。
时间复杂度:
O(n^2 * log(n))
空间复杂度:
O(n^2)
代码细节讲解
🦆
为什么在生成最简分数时,分子的范围是从1到denominator-1,而不包括denominator本身?
▷🦆
为什么选择使用列表推导而不是其他循环结构来实现这个算法,列表推导在效率上有什么优势或劣势?
▷🦆
该题解是否考虑了所有边界条件,例如n=1的情况,为什么输出是空数组?
▷