Middle-题目128:166. Fraction to Recurring Decimal

本文介绍了一种将任意分数转换为小数的方法,并针对循环小数的情况使用括号标记循环节。通过模拟竖式除法过程,利用HashMap记录余数与商的关系,有效地解决了循环小数的识别问题。

题目原文:
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)”.
题目大意:
把一个分数转换成小数,如果是循环小数,则用括号把循环节扩起来,输出对应的字符串。
题目分析:
就是模拟竖式除法,每一步迭代都记录下商和余数,用string记录下每一步的商,用一个HashMap记录下<余数,对应商的下标>。如果出现余数为0,则是有限小数,直接输出string即可,如果找到一个在HashMap中存在的余数,则说明发现了循环节,到HashMap中get一下就知道了循环节的开始点,这样也就结束了循环。
源码:(language:java)

public class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        if (numerator == 0) return "0";
        if (denominator == 0) return "";

        String ans = "";

        //如果结果为负数
        if ((numerator < 0) ^ (denominator < 0)) {
            ans += "-";
        }

        //下面要把两个数都转为正数,为避免溢出,int转为long
        long num = numerator, den = denominator;
        num = Math.abs(num);
        den = Math.abs(den);

        //结果的整数部分
        long res = num / den;
        ans += String.valueOf(res);

        //如果能够整除,返回结果
        long rem = (num % den) * 10;
        if (rem == 0) return ans;

        //结果的小数部分
        HashMap<Long, Integer> map = new HashMap<Long, Integer>();
        ans += ".";
        while (rem != 0) {
            //如果前面已经出现过该余数,那么将会开始循环
            if (map.containsKey(rem)) {
                int beg = map.get(rem); //循环体开始的位置
                String part1 = ans.substring(0, beg);
                String part2 = ans.substring(beg, ans.length());
                ans = part1 + "(" + part2 + ")";
                return ans;
            }

            //继续往下除
            map.put(rem, ans.length());
            res = rem / den;
            ans += String.valueOf(res);
            rem = (rem % den) * 10;
        }

        return ans;
    }
}

成绩:
5ms,beats 19.25%,众数4ms,59.22%
Cmershen的碎碎念:
本题乃Middle难度中ac率最低一题,但原理也不是很复杂,而是难在各种奇奇怪怪的边界情况,Leetcode的test case很多都侧重于一些特殊情况(这适合面试题,锻炼严谨的思维)而传统的oj题及赛题则更多侧重于大数据量下会不会tle。

2025-11-19 10:24:44.080 INFO : Compiling command(queryId=hive_20251119102417_5d5c931e-0c6d-41f5-a123-783d84502632) 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_employee_attendance, Columns: workshop_name, data_batch, data_type, hrefficiecvy_divide, dept_name, attnd_cnt 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_employee_attendance, Columns: bu_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_employee_attendance, Columns: level6_depart_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_employee_attendance, Columns: bu_name, workshop_name, data_batch, data_type, hrefficiecvy_divide, attnd_cnt, level6_depart_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_in_loss_staff, Columns: workshop_name, index_value, data_batch, hrefficiecvy_divide, dept_name, index_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_in_loss_staff, Columns: bu_name, workshop_name, index_value, data_batch, hrefficiecvy_divide, index_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_in_loss_staff, Columns: bu_name, level6_depart_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_hr_sxrz_in_loss_staff, Columns: bu_name, index_value, data_batch, hrefficiecvy_divide, level5_depart_name, index_name, level6_depart_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_mfg_sxlj_cry_crystal_pdt, Columns: workshop_name, round_ingot_w_val, date_value 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_mfg_sxlj_output_collect, Columns: workshop_name, prod_w_val, stat_date, index_name 2025-11-19 10:24:54.598 INFO : No Stats for sxcdm_dwd@dwd_sxzj_new_yield_details, Columns: sto_pow, factory, inspection_date, inspection_result, barcode, currentfactory 2025-11-19 10:24:54.598 INFO : No Stats for cdm_dim@dim_sxzj_mfgline, Columns: area_name, factory_code, factory_name 2025-11-19 10:24:54.598 INFO : No Stats for sxcdm_dwd@dwd_sxzj1_new_yield_details, Columns: sto_pow, factory, inspection_date, inspection_result, barcode, currentfactory 2025-11-19 10:24:54.598 INFO : No Stats for cdm_dim@dim_sxzj1_mfgline, Columns: area_name, factory_code, factory_name 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_mfg_sxqp_yield_dtl, Columns: workshop_name, prod_w_val, area_code, stat_date 2025-11-19 10:24:54.598 INFO : No Stats for ads_sx_ioc@ads_mfg_sxdc_prod_index, Columns: area_name, workshop_name, date_value, jkcspec, output_w_val 2025-11-19 10:24:54.598 INFO : No Stats for cdm_dim@dim_pub_date, Columns: week_start_date_wed, week_end_date_wed, date_id, week_of_year_wed 2025-11-19 10:24:54.598 INFO : No Stats for cdm_dim@dim_pub_date, Columns: yearmonthstr, month_timespan 2025-11-19 10:24:54.598 INFO : Warning: Shuffle Join MERGEJOIN[926][tables = [$hdt$_1]] in Stage 'Reducer 54' is a cross product 2025-11-19 10:24:54.598 INFO : Warning: Shuffle Join MERGEJOIN[936][tables = [$hdt$_2]] in Stage 'Reducer 59' is a cross product 2025-11-19 10:24:54.598 INFO : Semantic Analysis Completed (retrial = false) 2025-11-19 10:24:54.598 INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:_col0, type:string, comment:null), FieldSchema(name:_col1, type:string, comment:null), FieldSchema(name:_col2, type:string, comment:null), FieldSchema(name:_col3, type:string, comment:null), FieldSchema(name:_col4, type:string, comment:null), FieldSchema(name:_col5, type:string, comment:null), FieldSchema(name:_col6, type:string, comment:null), FieldSchema(name:_col7, type:timestamp, comment:null)], properties:null) 2025-11-19 10:24:54.598 INFO : Completed compiling command(queryId=hive_20251119102417_5d5c931e-0c6d-41f5-a123-783d84502632); Time taken: 24.631 seconds 2025-11-19 10:24:54.598 INFO : Executing command(queryId=hive_20251119102417_5d5c931e-0c6d-41f5-a123-783d84502632)switch applicationId of planId-1983017638615019081 from null to application_1744630663935_9685292 2025-11-19 10:25:08.615 INFO : Query ID = hive_20251119102417_5d5c931e-0c6d-41f5-a123-783d84502632 2025-11-19 10:25:08.615 INFO : Total jobs = 1 2025-11-19 10:25:08.615 INFO : Launching Job 1 out of 1 2025-11-19 10:25:08.615 INFO : Starting task [Stage-1:MAPRED] in serial mode 2025-11-19 10:25:08.615 INFO : Subscribed to counters: [] for queryId: hive_20251119102417_5d5c931e-0c6d-41f5-a123-783d84502632 2025-11-19 10:25:08.615 INFO : Tez session hasn't been created yet. Opening session 2025-11-19 10:25:08.615 INFO : Dag name: with zj_zgrs as (select dat...data_all_month (Stage-1) 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Setting tez.task.scale.memory.reserve-fraction to 0.30000001192092896 2025-11-19 10:25:08.615 INFO : Status: Running (Executing on YARN cluster with App id application_1744630663935_9685292) 2025-11-19 10:38:32.016 INFO : Completed executing command(queryId=hive_20251119102417_5d5c931e-0c6d-41f5-a123-783d84502632); Time taken: 829.345 seconds ==================================sql detailed error track info====================================== Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Application application_1744630663935_9685292 failed 2 times due to AM Container for appattempt_1744630663935_9685292_000002 exited with exitCode: 255 Failing this attempt.Diagnostics: [2025-11-19 10:37:41.735]Exception from container-launch. Container id: container_e37_1744630663935_9685292_02_000001 Exit code: 255 Exception message: Launch container failed Shell error output: Nonzero exit code=255, error message='Unknown error code' Shell output: main : command provided 1 main : run as user is simba main : requested yarn user is simba Getting exit code file... Creating script paths... Writing pid file... Writing to tmp file /opt2/hadoop/yarn/local/nmPrivate/application_1744630663935_9685292/container_e37_1744630663935_9685292_02_000001/container_e37_1744630663935_9685292_02_000001.pid.tmp Writing to cgroup task files... Creating local dirs... Launching container... [2025-11-19 10:37:41.736]Container exited with a non-zero exit code 255. Error file: prelaunch.err. Last 4096 bytes of prelaunch.err : Last 4096 bytes of stderr : Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... [2025-11-19 10:37:41.736]Container exited with a non-zero exit code 255. Error file: prelaunch.err. Last 4096 bytes of prelaunch.err : Last 4096 bytes of stderr : Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... Halting due to Out Of Memory Error... For more detailed output, check the application tracking page: http://dmp-datakun-master01:8188/applicationhistory/app/application_1744630663935_9685292 Then click on links to logs of each attempt. . Failing the application.
11-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值