End

LeetCode 分数加减运算 Kotlin

本文地址


目录

分数加减运算

题目描述

LeetCode-640

给定一个表示分数加减运算的字符串,返回计算结果。

  • 输入、输出字符串只包含 0-9 的数字,以及 /+- 符号(不会有空格)
  • 输入、输出分数格式均为 (-)分子/分母,正数前面的 + 会被省略
  • 输入只包含合法的最简分数,分子、分母的范围是[1,10](整数也会用分数来表示)
  • 输入分数的个数不超过 10 个,最终结果的分子与分母不超过 32 位整数(不会溢出)
  • 输出的分数需要是最简分数形式(整数也需要用分数来表示)

题目分析

主要步骤:

  • 分割、解析分数
  • 计算分母的最小公倍数
  • 将分数进行通分
  • 计算分子加减运算的结果
  • 将计算结果约分

求最小公倍数 & 最大公约数

最大公约数计算公式如下

20 36 -- 16
16 20 -- 4
4  16 -- 0  --> 最大公约数是 4

3 8 -- 5
3 5 -- 2
2 3 -- 1
1 2 -- 0    --> 最大公约数是 1

22 36 -- 14
14 22 -- 8
8  14 -- 6
6  8  -- 2
2  6  -- 0  --> 最大公约数是 2

最小公倍数 = a * b /最大公约数

// 求两个数的最大公约数,Greatest Common Divisor
private fun gcd(a: Int, b: Int): Int {
    var (big, small) = if (a > b) a to b else b to a

    while (small != 0) {
        val temp = small
        small = big % small
        big = temp
    }
    return big
}

// 求两个数的最小公倍数,Least Common Multiple
private fun lcm(a: Int, b: Int) = a * b / gcd(a, b)

完整代码

fun fractionAddition(expression: String): String {
    val pairs = expression
        .replace("-", "+-")
        .split("+")                          // 拆分每个分数
        .filter { it.isNotBlank() }          // 过滤非法数据
        .map { it.split("/") }               // 拆分分子分母
        .map { Pair(it[0].toInt(), it[1].toInt()) }

    val lcm = pairs
        .map { it.second }                   // 分母的集合
        .reduce { acc, i -> lcm(acc, i) }    // 所有分母的最小公倍数

    val sum = pairs
        .map { it.first * lcm / it.second }  // 分子通分
        .reduce { acc, i -> acc + i }        // 所有分子相加

    val gcd = gcd(kotlin.math.abs(sum), lcm) // 分子和分母的最大公约数
    val result = "${sum / gcd}/${lcm / gcd}" // 简化分数
    
    println("lcm: $lcm, sum: $sum, gcd: $gcd, result: $result")
    return result
}

// 求两个数的最大公约数,Greatest Common Divisor
private fun gcd(a: Int, b: Int): Int {
    var (big, small) = if (a > b) a to b else b to a

    while (small != 0) {
        val temp = small
        small = big % small
        big = temp
    }
    return big
}

// 求两个数的最小公倍数,Least Common Multiple
private fun lcm(a: Int, b: Int) = a * b / gcd(a, b)

2016-11-11

posted @ 2016-11-11 17:51  白乾涛  阅读(703)  评论(1)    收藏  举报