Fraction to Recurring Decimal

来源:互联网 发布:vb matlab 速度 编辑:程序博客网 时间:2024/05/22 03:17

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.

Show Tags
Have you met this question in a real interview?

思路:这题跟divide two integer是不一样的。divide two integer要求的返回的是int值。所以那题-128/-1 位移计算后,还是-128. (bit表达式是一样的)。但是题目要求是返回127.所以只能将-128转换成127再进行计算。

这题是要求返回的string,所以-128/-1返回的是128.  不关心Integer的范围。

转换成long是为了Math.abs的时候,不溢出,因为-128~127. Math.abs(-128)会变成128,但是int范围是127.所以会溢出。转换成long这样Math.abs会防止溢出。

divide two integer用long是为了防止移位溢出。

注意这两个题目的区别。divide two integer是要求返回的int,有范围要求,这个题目没有,只要求返回结果的string。不需要转换成int范围内的值。


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

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

public class Solution {     public String fractionToDecimal(int numerator, int denominator) {         long numeratorl = (long) numerator;         long denominatorl = (long) denominator;                  StringBuilder sb = new StringBuilder();         if((numerator>0 && denominator<0) ||(numerator<0 && denominator>0)){             sb.append("-");         }                  numeratorl = Math.abs(numeratorl);         denominatorl = Math.abs(denominatorl);                  //handle int part;         long res = numeratorl/denominatorl;         numeratorl = (numeratorl%denominatorl)*10;         sb.append(res);                  if(numeratorl!=0){             sb.append(".");         }                  //handle float part;         HashMap<Long,Integer> hashmap = new HashMap<Long,Integer>();         while(numeratorl!=0){             if(hashmap.containsKey(numeratorl)){                 int index = hashmap.get(numeratorl);                 sb.insert(index,"(");                 sb.append(")");                 break;             }else{                 res = numeratorl/denominatorl;                 hashmap.put(numeratorl,sb.length());                 numeratorl = (numeratorl%denominatorl)*10;                 sb.append(res);             }         }         return sb.toString();     } }


0 0