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)".

分析:https://segmentfault.com/a/1190000003794677

哈希表法

复杂度

时间 O(N) 空间 O(N)

思路

整数部分很好处理,只要注意正负号的区分就行了,但是如何处理小数部分呢。如果只是简单的除法,那我们每次把余数乘以10,再除以被除数就可以得到当前位的小数了,得到新的余数,直到余数为0。难点在于,对于无尽循环小数,我们一直这么做永远也不能让余数变为0。这里我们可以用一个哈希表记录每次的余数,如果余数出现重复的时候,说明就产生循环了。为了能找出小数中循环的部分,我们在用哈希表时,还要把每个余数对应的小数位记录下来,这样子我们一旦遇到重复,就知道是从哪里开始循环的。

注意

如果输入的被除数很大,那么余数乘以10有可能溢出,所以我们用long来保存numerator和denominator。

 public class Solution {
public String fractionToDecimal(int numerator, int denominator) {
long num = numerator, den = denominator;
if (num == || den == ) return "";
boolean negative = (num > && den < ) || (num < && den > );
num = Math.abs(num);
den = Math.abs(den);
String integ = (negative ? "-" : "") + String.valueOf(num / den);
num = num % den;
if (num != ) {
HashMap<Long, Integer> map = new HashMap<>();
int pos = ;
StringBuilder frac = new StringBuilder();
while (num != ) {
map.put(num, pos);
num = num * ;
frac.append(num / den);
num = num % den;
if (map.containsKey(num)) {
// 将非循环部分和循环部分分开
String pre = frac.substring(, map.get(num));
String loop = frac.substring(map.get(num));
return integ + "." + pre + "(" + loop + ")";
}
pos++;
}
return integ + "." + frac.toString();
}
return integ;
}
}

最新文章

  1. SqlServer性能优化 提高并发性能二(九)
  2. Android中GPS定位的简单应用
  3. C# Excel处理工具
  4. Rearrange a string so that all same characters become d distance away
  5. 【树莓派】基于TinyProxy搭建HTTP代理服务器
  6. HTTP通信原理
  7. Android7.0 Phone应用源码分析(二) phone来电流程分析
  8. C#原始类型扩展方法—this参数修饰符
  9. JSBinding + SharpKit / 实战:转换 Survival Shooter
  10. nginx +lua +redis 构建自动缓存系统
  11. CSS3之简易的3D模型构建[原创开源]
  12. ios 常用宏(copy)
  13. CVE-2017-8464远程命令执行漏洞(震网漏洞)复现
  14. vue 学习小记
  15. vue结合axios使用入门
  16. IE缓存清除
  17. dd 命令的使用
  18. table-cell http://www.cnblogs.com/StormSpirit/archive/2012/10/24/2736453.html
  19. Linux搭建SVN
  20. service fabric重装电脑后集群失败

热门文章

  1. HTTP1.0与HTTP1.1的区别
  2. Effective Objective-C 2.0 — 第13条:用“方法调配 技术” 调试 “黑盒方法”
  3. php生成唯一随机码
  4. mysql tinyint
  5. gtest
  6. 关于使用jacob出现的异常
  7. JAVA访问权限控制[zhuan]
  8. [译]Create a Web API in MVC 6
  9. VTK初学一,a_Vertex图形点的绘制
  10. PHP如何释放内存之unset销毁变量并释放内存详解