Leetcode NO.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)".
本题我在处理边界条件的时候花了很长时间,不过我认为那个应该不算算法的重点,这题的重点在于hashmap, 代码如下:

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
         string retVal = "";
        long long nr = numerator;
        long long dr = denominator;

        if ((nr < 0 && dr > 0) || (nr > 0 && dr < 0))
        	retVal += "-";

        if (nr < 0)
        	nr = - nr;
        if (dr < 0)
        	dr = -dr;

        retVal += to_string(nr/dr);

        unordered_map<int, int> num_map;	/* first is numerator, second is posision */
        unordered_map<int, int>::iterator it;

        nr = nr % dr;
        if (nr != 0)
        	retVal += ".";
        int pos = retVal.length();
        while (nr != 0) {
        	nr = nr * 10;
        	it  = num_map.find(nr);
        	if (it != num_map.end()) {
        		/* find it */
				retVal.insert(it->second,"(");
				retVal += ")";
				break;
        	}
        	else {
        		num_map[nr] = pos;
        		retVal += to_string(nr/dr);
        	}
        	nr = nr % dr;
        	++pos;
        }
        return retVal;
    }
};
算法描述:

1,构建hashmap<int, int>第一个参数是numerator,第二个参数是position.

2,举一个计算过程的例子,numerator简称为n, denominator简称为d,

n = 20,  d = 11,这样计算记过应该是1.8181818->1.(81)

计算过程:

整数部分n/d=1,然后n = n % d = 9,此时因为n还大于0,所以要继续计算,并加上小数点,

此时n = n * 10 = 90,进入循环,n % d = 2,将其插入hashmap,其值等于位置,即第三位(2),

string的小数点后面加上n/d = 8,

进入下一个循环,n = n * 10 = 20,n % d = 9,将其插入hashmap,string后加上(n/d=1),

下一个循环,n = n * 10 = 90,n%d = 2,此时搜索hashmap,发现曾经出现过2,证明出现了循环,括号开始位为2的对应值,结束位为当前的位。


发发牢骚:

感觉自己差的知识好多。。。什么backtracking, dynamically programming都没有接触过,准备选下coursera算法课,巩固一下。。。

这道题在11月的时候又做了一遍,这次思路还是一样,不过代码风格还是有点区别,上传下新版本吧:

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) {
            return "0";
        }
        bool flag = false;
        if ((numerator < 0 and denominator < 0) or (numerator > 0 and denominator > 0)) {
            flag = true;
        }
        long n = abs(static_cast<long>(numerator));
        long d = abs(static_cast<long>(denominator));
        cout << n << endl;
        string ret = "";
        unordered_map<long, int> hashmap;
        long Int = n / d;
        n %= d;
        int i = 0;
        while (n != 0) {
            auto found = hashmap.find(n);
            if (found != hashmap.end()) {
                ret.insert(hashmap[n], "(");
                ret += ")";
                break;   
            }
            hashmap[n] = i++;
            n *= 10;
            int tmp = n / d;
            ret += to_string(tmp);
            n %= d;
        }
        ret = ret.empty() ? to_string(Int) : to_string(Int) + "." + ret;
        return flag ? ret : "-" + ret;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值