zoukankan      html  css  js  c++  java
  • 166. 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.
    
    For example,
    
    Given numerator = 1, denominator = 2, return "0.5".
    Given numerator = 2, denominator = 1, return "2".
    Given numerator = 2, denominator = 3, return "0.(6)".
    Credits:
    Special thanks to @Shangrila for adding this problem and creating all test cases.

    存在正负情况,处理方式是按正数处理,符号最后在判断,那么我们需要把除数和被除数取绝对值,那么问题就来了:由于整型数INT的取值范围是-2147483648~2147483647,而对-2147483648取绝对值就会超出范围,所以我们需要先转为long long型再取绝对值。那么怎么样找循环呢,肯定是再得到一个数字后要看看之前有没有出现这个数。为了节省搜索时间,我们采用哈希表来存数每个小数位上的数字。还有一个小技巧,由于我们要算出小数每一位,采取的方法是每次把余数乘10,再除以除数,得到的商即为小数的下一位数字。等到新算出来的数字在之前出现过,则在循环开始出加左括号,结束处加右括号。代码如下:

    public String fractionToDecimal(int numerator, int denominator) {
                long num = (long)numerator;
                long den = (long)denominator;
                boolean isNeg = false;
                if (num < 0) isNeg = !isNeg;
                if (den < 0) isNeg = !isNeg;
                num = Math.abs(num);
                den = Math.abs(den);
                HashMap<Long, Integer> dict = new HashMap<Long, Integer>();
                StringBuffer res = new StringBuffer();
                if (num == 0) return "0";
                long digit = num / den; //deal with integer part
                res.append(digit);
                num = (num % den) * 10;
                if (num != 0) res.append("."); //deal with decimal point
                else return res.toString();
                while (num != 0 && !dict.containsKey(num)) {
                    dict.put(num, res.length());
                    digit = num / den;
                    res.append(digit);
                    num = (num % den) * 10;
                }
                if (dict.containsKey(num)) {
                    res.insert(dict.get(num).intValue(), '(');
                    res.append(')');
                }
                if (isNeg) res.insert(0, '-');
                return res.toString();
            }
    

     res.insert(dict.get(num).intValue(), '(');  XXX.intValue()转化为int型, 这里不能自动拆箱,要用int  

    核心思想就是:模仿除法的过程,然后用hashmap存储numerator的值,如果出现了相同的numerator那么就出现了cycle,

    利用stringbuilder来append string,hashmap里面 key是numerator,value是stringbuilder.length,这样出现了cycle,知道如何去插入"(",再append")".

    还要记得在第一次除法完成之后,加上小数点,因为第一次除法就可以把整个整数部分全算出来了,接下来小数部分才是一位一位地算

    如何计算整数部分, 如何循环小数部分, 如何找循环点, 如何判断整出完, 如何判断结果正负.

    负数取绝对值转化为正数

  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    107. Binary Tree Level Order Traversal II
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    104. Maximum Depth of Binary Tree
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    系统和进程相关信息
    文件I/0缓冲
    系统编程概念(文件系统mount等函数的使用)
  • 原文地址:https://www.cnblogs.com/apanda009/p/7169932.html
Copyright © 2011-2022 走看看