zoukankan      html  css  js  c++  java
  • [Swift]LeetCode166. 分数到小数 | Fraction to Recurring Decimal

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10127520.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

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

    12ms

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

    12ms

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

    16ms

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

    20ms

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

    20ms

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

    36ms

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

    56ms

     1 class Solution {
     2     func fractionToDecimal(_ numerator: Int, _ denominator: Int) -> String {
     3         if numerator == 0 { return "0" }
     4         let sign = (numerator > 0 ? 1 : -1) ^ (denominator > 0 ? 1 : -1) == 0 ? "" : "-"
     5         var result = sign
     6         var a = abs(numerator)
     7         let b = abs(denominator)
     8         result += "(a/b)"
     9         a = a % b
    10         if a != 0 {
    11             result += "."
    12         } else {
    13             return result
    14         }
    15         var decimal = ""
    16         var array = [a]
    17         while true {
    18             a = a * 10
    19             decimal += "(a/b)"
    20             a = a % b
    21             if a == 0 {
    22                 result += decimal
    23                 return result
    24             }
    25             if let index = array.index(of: a) {
    26                 var temp = [Character](decimal)
    27                 temp.insert("(", at: index)
    28                 temp.append(")")
    29                 result += String(temp)
    30                 return result
    31             } else {
    32                 array.append(a)
    33             }
    34         }
    35     }
    36 }
  • 相关阅读:
    学习算法和刷题的思路指南
    提交包到iTunes Connect时构建版本“正在处理”后直接消失的问题
    对网络通讯的一些学习和总结
    iOS开发 dispatch_block_t 简单的实现不带参数的回调函数
    app刚开始启动时(即:appdelegate文件中)可以写的几个功能
    拷贝项目时,自己总结的一些小事项
    iOS开发中遇到的一些问题以及解决办法总结
    宝库~iOS开发笔试题
    GCD 之线程死锁
    iOS开发之旅之懒加载
  • 原文地址:https://www.cnblogs.com/strengthen/p/10127520.html
Copyright © 2011-2022 走看看