微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[Swift]LeetCode166. 分数到小数 | Fraction to Recurring Decimal

Given two integers representing the numerator and denominator of a fraction,return the fraction in string format.

If the fractional part is repeating,enclose the repeating part in parentheses.

Example 1:

Input: numerator = 1,denominator = 2
Output: "0.5"

Example 2:

Input: numerator = 2,denominator = 1
Output: "2"

Example 3:

Input: numerator = 2,denominator = 3
Output: "0.(6)"

给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。

如果小数部分为循环小数,则将循环的部分括在括号内。

示例 1:

输入: numerator = 1,denominator = 2
输出: "0.5"

示例 2:

输入: numerator = 2,denominator = 1
输出: "2"

示例 3:

输入: numerator = 2,denominator = 3
输出: "0.(6)"
8ms
@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         let s1 = numerator > 0 ? 1 : -1
@H_404_40@ 4         let s2 = denominator > 0 ? 1 : -1
@H_404_40@ 5         let numerator = abs(numerator)
@H_404_40@ 6         let denominator = abs(denominator)
@H_404_40@ 7         let num = numerator / denominator
@H_404_40@ 8         var remain = numerator % denominator 
@H_404_40@ 9         var remains = [Int : Int]()
@H_404_40@10         var res = ""
@H_404_40@11         if s1*s2 < 0 && (num > 0 || remain > 0) {
@H_404_40@12             res += "-"
@H_404_40@13         }
@H_404_40@14         res += "\(num)"
@H_404_40@15         if remain > 0 {
@H_404_40@16             res += "."
@H_404_40@17         }
@H_404_40@18         var frac = ""
@H_404_40@19         var pos = 0
@H_404_40@20         while remain > 0 {
@H_404_40@21             if let pos = remains[remain] {
@H_404_40@22                 frac.insert("(",at: frac.index(frac.startIndex,offsetBy: pos))
@H_404_40@23                 frac += ")"
@H_404_40@24                 return res+frac
@H_404_40@25             }
@H_404_40@26             remains[remain] = pos
@H_404_40@27             frac += String(remain*10 / denominator)
@H_404_40@28             remain = remain*10 % denominator
@H_404_40@29             pos += 1
@H_404_40@30         }
@H_404_40@31         return res+frac
@H_404_40@32     }
@H_404_40@33 }

12ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         
@H_404_40@ 4         if denominator == 0 { return "NaN" }
@H_404_40@ 5         
@H_404_40@ 6         //Big bad voodoo magic.
@H_404_40@ 7         var numerator = numerator
@H_404_40@ 8         var denominator = denominator
@H_404_40@ 9         
@H_404_40@10         //Note,for bools "!=" behaves the same as "^" which is not allowed.
@H_404_40@11         var negative = (numerator < 0) != (denominator < 0)
@H_404_40@12         
@H_404_40@13         numerator = abs(numerator)
@H_404_40@14         denominator = abs(denominator)
@H_404_40@15         
@H_404_40@16         var result = String(numerator / denominator)
@H_404_40@17         var remainder = (numerator % denominator) * 10
@H_404_40@18         
@H_404_40@19         if remainder == 0 {
@H_404_40@20             if negative == true && numerator != 0 {
@H_404_40@21                 return String("-") + result
@H_404_40@22             } else {
@H_404_40@23                 return result
@H_404_40@24             }
@H_404_40@25         }
@H_404_40@26         
@H_404_40@27         result += "."
@H_404_40@28         
@H_404_40@29         //See if we find repeating digits...
@H_404_40@30         //At the point where our long division keeps
@H_404_40@31         //dividing into the same NO,we loop 4evz
@H_404_40@32         var repeatMap = [Int:Int]()
@H_404_40@33         
@H_404_40@34         while remainder != 0 {
@H_404_40@35             
@H_404_40@36             //We got a repeater? Or nah?
@H_404_40@37             if let repeatIndex = repeatMap[remainder] {
@H_404_40@38                 result.insert("(",at: result.index(result.startIndex,offsetBy: repeatIndex))
@H_404_40@39                 result += ")"
@H_404_40@40                 break
@H_404_40@41             }
@H_404_40@42             
@H_404_40@43             result += String(remainder / denominator)
@H_404_40@44             
@H_404_40@45             //Set our repeater..
@H_404_40@46             repeatMap[remainder] = result.count - 1
@H_404_40@47             
@H_404_40@48             //Perform one more step of long division
@H_404_40@49             remainder = (remainder % denominator) * 10 
@H_404_40@50         }
@H_404_40@51 
@H_404_40@52         if negative == true {
@H_404_40@53             return String("-") + result
@H_404_40@54         }
@H_404_40@55         return result
@H_404_40@56     }
@H_404_40@57 }

12ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         
@H_404_40@ 4         if numerator  == 0 {
@H_404_40@ 5             return "0"
@H_404_40@ 6         }
@H_404_40@ 7         
@H_404_40@ 8         var res = ""
@H_404_40@ 9         
@H_404_40@10         if ((numerator < 0) && (denominator >= 0)) || ((numerator >= 0) && (denominator < 0)) {
@H_404_40@11             res += "-"
@H_404_40@12         }
@H_404_40@13         
@H_404_40@14         let absNum = abs(numerator)
@H_404_40@15         let absDen = abs(denominator)
@H_404_40@16         
@H_404_40@17         res += String(absNum/absDen)
@H_404_40@18         
@H_404_40@19         var remander = absNum % absDen
@H_404_40@20         
@H_404_40@21         if remander == 0 {
@H_404_40@22             return res
@H_404_40@23         }
@H_404_40@24         
@H_404_40@25         res += "."
@H_404_40@26         
@H_404_40@27         var remanders = [Int : Int]()
@H_404_40@28         
@H_404_40@29         var pos = res.count
@H_404_40@30         
@H_404_40@31         var add = 0
@H_404_40@32         var hasRecycyle = false
@H_404_40@33         
@H_404_40@34         while remander != 0 && !hasRecycyle {
@H_404_40@35             if remanders.keys.contains(remander) {
@H_404_40@36                 add = remanders[remander]!
@H_404_40@37                 hasRecycyle = true
@H_404_40@38                 continue
@H_404_40@39             }
@H_404_40@40             
@H_404_40@41             remanders[remander] = pos
@H_404_40@42             pos += 1
@H_404_40@43             res += String(10 * remander / absDen)
@H_404_40@44             remander = (10 * remander) % absDen
@H_404_40@45         }
@H_404_40@46         
@H_404_40@47         if hasRecycyle {
@H_404_40@48             res.insert("(",at: res.index(res.startIndex,offsetBy: add))
@H_404_40@49             res += ")"
@H_404_40@50         }
@H_404_40@51         
@H_404_40@52         
@H_404_40@53         return res
@H_404_40@54     }
@H_404_40@55 }

16ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         var s1:Int = numerator >= 0 ? 1 : -1
@H_404_40@ 4         var s2:Int = denominator >= 0 ? 1 : -1
@H_404_40@ 5         var num:Int = abs(numerator )
@H_404_40@ 6         var den:Int = abs(denominator )
@H_404_40@ 7         var out:Int = num / den
@H_404_40@ 8         var rem:Int = num % den
@H_404_40@ 9         var m:[Int: Int] = [Int: Int]()
@H_404_40@10         var res:String = String(out)
@H_404_40@11         if s1 * s2 == -1 && (out > 0 || rem > 0)
@H_404_40@12         {
@H_404_40@13             res = "-" + res
@H_404_40@14         }
@H_404_40@15         if rem == 0 {return res}
@H_404_40@16         res += "."
@H_404_40@17         var s:String = ""
@H_404_40@18         var pos:Int = 0
@H_404_40@19         while(rem != 0)
@H_404_40@20         {
@H_404_40@21             if m[rem] != nil
@H_404_40@22             {
@H_404_40@23                 var index = s.index(s.startIndex,offsetBy: m[rem]!)
@H_404_40@24                 s.insert("(",at:index )
@H_404_40@25                 s += ")"
@H_404_40@26                 return res + s
@H_404_40@27             }
@H_404_40@28             m[rem] = pos
@H_404_40@29             s += String((rem * 10) / den)
@H_404_40@30             rem = (rem * 10) % den
@H_404_40@31             pos += 1
@H_404_40@32         }
@H_404_40@33         return res + s
@H_404_40@34     }
@H_404_40@35 }

20ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         
@H_404_40@ 4         if numerator % denominator == 0 {
@H_404_40@ 5             return String(numerator/denominator)
@H_404_40@ 6         }
@H_404_40@ 7         
@H_404_40@ 8         let n = abs(numerator);
@H_404_40@ 9         let d = abs(denominator);
@H_404_40@10         
@H_404_40@11         var sign = ""
@H_404_40@12         
@H_404_40@13         if numerator > 0 && denominator < 0 || numerator < 0 && denominator > 0{
@H_404_40@14             sign = "-"
@H_404_40@15         }
@H_404_40@16         
@H_404_40@17         var i = n
@H_404_40@18         while i > d {
@H_404_40@19             i = i/d
@H_404_40@20         }
@H_404_40@21         
@H_404_40@22         var dic = Dictionary<Int,Int>()
@H_404_40@23         
@H_404_40@24         var res = n % d;
@H_404_40@25         var s = String()
@H_404_40@26         
@H_404_40@27         var count = 0
@H_404_40@28         
@H_404_40@29         repeat {
@H_404_40@30             dic[res] = count
@H_404_40@31             res = res * 10;
@H_404_40@32             s.append(String(abs(res/d)))
@H_404_40@33             res = res % d
@H_404_40@34             count = count + 1
@H_404_40@35         } while (res != 0 && dic[res] == nil)
@H_404_40@36         
@H_404_40@37         if res == 0 {
@H_404_40@38             return sign + String(n/d) + "." + s;
@H_404_40@39         }
@H_404_40@40         let idx = s.index(s.startIndex,offsetBy: dic[res]!)
@H_404_40@41         return sign + String(n/d) + "." + s.substring(to: idx) + "(" + s.substring(from: idx) + ")"
@H_404_40@42     }
@H_404_40@43 }

20ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         let r = numerator % denominator
@H_404_40@ 4         let k = numerator / denominator
@H_404_40@ 5         if r == 0 {
@H_404_40@ 6             return "\(k)"
@H_404_40@ 7         }
@H_404_40@ 8         
@H_404_40@ 9         let tail = helper(abs(r),abs(denominator))
@H_404_40@10         var ret = "\(abs(k)).\(tail)"
@H_404_40@11         if numerator * denominator < 0 {
@H_404_40@12             ret = "-" + ret
@H_404_40@13         }
@H_404_40@14         return ret
@H_404_40@15     }
@H_404_40@16     
@H_404_40@17     
@H_404_40@18     func helper(_ n: Int,_ m: Int) -> String {
@H_404_40@19         var ret = ""
@H_404_40@20         var map = [Int: Int]()
@H_404_40@21         var x = n
@H_404_40@22         while x != 0 {
@H_404_40@23             if let i = map[x] {
@H_404_40@24                 ret = ret.prefix(i) + "(" + ret.suffix(ret.count - i) + ")"
@H_404_40@25                 return ret
@H_404_40@26             }
@H_404_40@27             let y = x * 10
@H_404_40@28             let k = y / m
@H_404_40@29             map[x] = ret.count
@H_404_40@30             ret += "\(k)"
@H_404_40@31             x = y % m
@H_404_40@32         }
@H_404_40@33         return ret
@H_404_40@34     }
@H_404_40@35 }

36ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3          if denominator == 0 {
@H_404_40@ 4             return ""
@H_404_40@ 5         }
@H_404_40@ 6         
@H_404_40@ 7         if numerator == 0 {
@H_404_40@ 8             return "0"
@H_404_40@ 9         }
@H_404_40@10         
@H_404_40@11         //取绝对值
@H_404_40@12         var num1 = numerator > 0 ? numerator : -numerator
@H_404_40@13         let num2 = denominator > 0 ? denominator : -denominator
@H_404_40@14         //取方向
@H_404_40@15         var  result = (numerator > 0 && denominator < 0) || (numerator < 0 && denominator > 0) ? "-" : ""
@H_404_40@16         
@H_404_40@17         //整数部分
@H_404_40@18         result += String(num1/num2)
@H_404_40@19         num1 = num1 % num2
@H_404_40@20         if num1 == 0 {
@H_404_40@21             return result
@H_404_40@22         }else {
@H_404_40@23             result += "."
@H_404_40@24         }
@H_404_40@25         
@H_404_40@26         //小数部分
@H_404_40@27         var dic = [Int:Int]()
@H_404_40@28         
@H_404_40@29         while num1 != 0 {
@H_404_40@30             if dic.keys.contains(num1) {
@H_404_40@31                 let index = result.index(result.startIndex,offsetBy: dic[num1]!)
@H_404_40@32                 result.insert("(",at: index)
@H_404_40@33                 result += ")"
@H_404_40@34                 break
@H_404_40@35             }
@H_404_40@36             dic[num1] = result.count
@H_404_40@37             num1 *= 10
@H_404_40@38             result += String(num1/num2)
@H_404_40@39             num1 %= num2
@H_404_40@40         }
@H_404_40@41         return result
@H_404_40@42     }
@H_404_40@43 }

56ms

@H_404_40@ 1 class Solution {
@H_404_40@ 2     func fractionToDecimal(_ numerator: Int,_ denominator: Int) -> String {
@H_404_40@ 3         if numerator == 0 { return "0" }
@H_404_40@ 4         let sign = (numerator > 0 ? 1 : -1) ^ (denominator > 0 ? 1 : -1) == 0 ? "" : "-"
@H_404_40@ 5         var result = sign
@H_404_40@ 6         var a = abs(numerator)
@H_404_40@ 7         let b = abs(denominator)
@H_404_40@ 8         result += "\(a/b)"
@H_404_40@ 9         a = a % b
@H_404_40@10         if a != 0 {
@H_404_40@11             result += "."
@H_404_40@12         } else {
@H_404_40@13             return result
@H_404_40@14         }
@H_404_40@15         var decimal = ""
@H_404_40@16         var array = [a]
@H_404_40@17         while true {
@H_404_40@18             a = a * 10
@H_404_40@19             decimal += "\(a/b)"
@H_404_40@20             a = a % b
@H_404_40@21             if a == 0 {
@H_404_40@22                 result += decimal
@H_404_40@23                 return result
@H_404_40@24             }
@H_404_40@25             if let index = array.index(of: a) {
@H_404_40@26                 var temp = [Character](decimal)
@H_404_40@27                 temp.insert("(",at: index)
@H_404_40@28                 temp.append(")")
@H_404_40@29                 result += String(temp)
@H_404_40@30                 return result
@H_404_40@31             } else {
@H_404_40@32                 array.append(a)
@H_404_40@33             }
@H_404_40@34         }
@H_404_40@35     }
@H_404_40@36 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐