题目

思路

本题能够拆解为几个小问题解决

1.符号的计算

2.小数点前整数局部的计算

3.小数点后小数的计算

(1)无限的小数,当余数为零时进行计算(2)有限循环小数,当呈现反复的数字时,将循环局部退出字符串(3)有限不循环小数 ,因为分数为有理数,无需思考该类小数

小数的具体计算方法能够应用竖式计算的长除法实现计算

代码

func fractionToDecimal(numerator, denominator int) string {    if numerator%denominator == 0 {        return strconv.Itoa(numerator / denominator)    }    s := []byte{}    if numerator < 0 != (denominator < 0) {        s = append(s, '-')    }    // 整数局部    numerator = abs(numerator)    denominator = abs(denominator)    integerPart := numerator / denominator    s = append(s, strconv.Itoa(integerPart)...)    s = append(s, '.')    // 小数局部    indexMap := map[int]int{}    remainder := numerator % denominator    for remainder != 0 && indexMap[remainder] == 0 {        indexMap[remainder] = len(s)        remainder *= 10        s = append(s, '0'+byte(remainder/denominator))        remainder %= denominator    }    if remainder > 0 { // 有循环节        insertIndex := indexMap[remainder]        s = append(s[:insertIndex], append([]byte{'('}, s[insertIndex:]...)...)        s = append(s, ')')    }    return string(s)}func abs(x int) int {    if x < 0 {        return -x    }    return x}

复杂度剖析

工夫复杂度:O(l),其中 l 是答案字符串的长度,这道题中 l≤10^4 。对于答案字符串中的每一个字符,计算工夫都是 O(1)。

空间复杂度:O(l),其中 l 是答案字符串的长度,这道题中 l<10^4。空间复杂度次要取决于答案字符串和哈希表,哈希表中的每个键值对所对应的下标各不相同,因而键值对的数量不会超过 l。