边工作边刷题:70天一遍leetcode: day 6

Fraction to Recurring Decimal

要点:

  • 基本公式:当余数小于除数,那么X10然后继续,这个意思就是小数位的数值表示的是余数相对于除数在10中占几份。
  • 注意小数点左边是不用按位计算的,直接一个除法
  • 如何计算循环部分?因为循环部分只会出现在末尾,直观的想法是最后再把循环位补到字符串结果里。但是这个方法行不通,因为不知道从哪个位置

注意点:

  • 符号:记录 => 取abs => 取反
  • 如何记录循环:如果remaining已经在map里了,说明之后的计算就是重复之前的
class Solution(object):
    def fractionToDecimal(self, numerator, denominator):
        """
        :type numerator: int
        :type denominator: int
        :rtype: str
        """
        sign = 1
        if numerator<0:
            sign = -1
            numerator = -numerator
        
        if denominator<0:
            sign = -sign
            denominator = -denominator
        
        q = numerator/denominator
        r = numerator-q*denominator
        hmap = {}
        res = []
        if sign==-1 and (q!=0 or r!=0): res = ["-"]
        res.append(str(q))
        if r>0: res.append(".")
        while r>0:
            print r
            if r in hmap:
                res.insert(hmap[r],"(")
                res.append(")")
                break
            else:
                hmap[r]=len(res)
                q = r*10/denominator
                r = r*10-q*denominator
                res.append(str(q))
        
        return ''.join(res)
        

posted @ 2016-05-19 11:28  absolute100  阅读(100)  评论(0编辑  收藏  举报