博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode----166. Fraction to Recurring Decimal
阅读量:4112 次
发布时间:2019-05-25

本文共 1886 字,大约阅读时间需要 6 分钟。

链接:

大意:

给定两个整数n和d,分别作为分子和分母,求出 n/d的小数形式,当小数有循环体时,使用“()”将循环体包围起来。例子:

思路:

解决此问题,主要需要注意以下几点:

  1. 结果是否为0。即n是否等于0,若等于0,则直接返回"0"
  2. 可能出现整型溢出,所以需要将两个整数先转成long型,记为nLong,dLong
  3. 判断结果的正负。可以判断 nLong * dLong的正负来知道除法的正负。之后便是使用 abs(nLong) 与 abs(dLong)来进行计算
  4. 怎样获得小数部分:模拟一般除法运算,都是余数乘10(作为新的被除数)除以除数dLong,得到一个商;余数乘10模(取余)除数dLong,得到下一阶段的被除数。如果没有循环体,则最终余数肯定是0
  5. 如果有循环体:则可以对于小数部分的每一个数(商),我们记录这个商所对应的余数(即这个商是有哪个被除数得来的)以及该商在小数部分的位置(0,1,2,...),将其put进一个map中保存。当再出现一个余数rem已经出现在map.keys()中,则表明循环体为map.get(rem)到当前余数小数部分末尾。

具体实现见如下代码。

代码:

class Solution {    public String fractionToDecimal(int n, int d) {        if (n == 0)            return "0";        boolean positive = true;        // 为解决整型越界的问题 将int转为long        long nLong = (long)n, dLong = (long)d;        // 判断正负        if (nLong * dLong < 0L)            positive = false;        nLong = Math.abs(nLong);        dLong = Math.abs(dLong);        // System.out.println(nLong);        long intPart = nLong / dLong, rem = nLong % dLong; // 得到整数部分 和 余数        if (rem == 0)            return positive ? Long.toString(intPart) : "-" + Long.toString(intPart);        StringBuilder sb = new StringBuilder(); // 得到小数部分 可能含有"()"        Map
map = new HashMap<>(); // 存储余数rem和rem / d所在的StringBuilder中的位置 // 当余数为0 或者 map中出现过该余数时,跳出循环 int index = 0; while (rem != 0L && !map.containsKey(rem)) { map.put(rem, index++); nLong = rem * 10; // 模拟除法 rem = nLong % dLong; sb.append(nLong / dLong); } if (rem == 0) { String res = intPart + "." + sb.toString(); return positive ? res : "-" + res; } sb.insert(map.get(rem), "("); sb.append(")"); String res = intPart + "." + sb.toString(); return positive ? res : "-" + res; }}

结果:

结论:

有幸能再遇到考研机试题的最后一题,当时考研用的是C语言,里面很多数据结构都没有现成的,需要自己造轮子(当然当时也是菜的不知道map是什么东西)。。。现在能使用时间和空间效率都不错的方法解决,还是挺欣慰的。。。 

 

 

转载地址:http://gxesi.baihongyu.com/

你可能感兴趣的文章
Vue动态生成el-checkbox点击无法选中的解决方法
查看>>
python __future__
查看>>
MySQL Tricks1
查看>>
python 变量作用域问题(经典坑)
查看>>
pytorch
查看>>
pytorch(二)
查看>>
pytorch(三)
查看>>
pytorch(四)
查看>>
pytorch(5)
查看>>
pytorch(6)
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>