题解 | #整数转罗马数字#

整数转罗马数字

https://www.nowcoder.com/practice/7649cde9711f42da81209819b790a640

import java.util.*;

/**
 * NC361 整数转罗马数字
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型 
     * @return string字符串
     */
    public String ArabicToRoman (int n) {
        // return solution1(n);
        return solution2(n);
    }

    private final int[] values = new int[]{1000, 500, 100, 50, 10, 5, 1};
    private final HashMap<Integer,Character> map = new HashMap<Integer,Character>(){{
        put(1, 'I');
        put(5, 'V');
        put(10, 'X');
        put(50, 'L');
        put(100, 'C');
        put(500, 'D');
        put(1000, 'M');
    }};

    /**
     * 哈希: HashMap
     * @param n
     * @return
     */
    private String solution1(int n){
        StringBuilder sb = new StringBuilder();
        int remain = n;
        int times;
        for(int val: values){
            times = remain/val;
            remain = remain%val;
            while(times-- > 0){
                sb.append(map.get(val));
            }
            if(remain == 0){
                break;
            }
        }

        // 四连情况处理 VIIII LXXXX DCCCC | IIII XXXX CCCC
        String result = sb.toString().replace("VIIII", "IX").replace("LXXXX", "XC").replace("DCCCC", "CM").replace("IIII", "IV").replace("XXXX", "XL").replace("CCCC", "CD");

        return result;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////

    private final int[] arabics = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
    private final String[] romans = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

    /**
     * 哈希: 数组
     * @param n
     * @return
     */
    private String solution2(int n){
        StringBuilder sb = new StringBuilder();
        int remain = n;
        int times;
        int val;
        for(int i=0; i<arabics.length; i++){
            val = arabics[i];
            times = remain/val;
            remain = remain%val;
            while(times-- > 0){
                sb.append(romans[i]);
            }
            if(remain == 0){
                break;
            }
        }

        return sb.toString();
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
09-04 14:00
点赞 评论 收藏
分享
08-27 21:03
已编辑
西南石油大学 Java
冷花幽露:大概率是了,京东面试就是这样。我上周一面也是20多分钟,面试官问的很刁钻的问题也答上来了,面完过了几天还是没推进,泡池子,昨天一看挂了。如果一面完第2天没有收到2面邀请,基本上不用抱希望了。如果你的bg是985,面试流程也是和我们一样,20多分钟,唯一区别就是面完他们会很快收到二面邮件,而不像我们泡池子然后挂掉
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
08-08 18:20
职场水母:这题思路是什么,我目前想的一个暴力方法就是先把这个链表遍历一遍,用哈希表存储出现次数,然后再根据哈希表来一个一个删除节点,
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务