本文共 1886 字,大约阅读时间需要 6 分钟。
给定两个整数n和d,分别作为分子和分母,求出 n/d的小数形式,当小数有循环体时,使用“()”将循环体包围起来。例子:
解决此问题,主要需要注意以下几点:
具体实现见如下代码。
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(); // 得到小数部分 可能含有"()" Mapmap = 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/