[Java][Leetcode middle] 12. 整数转罗马数字

自己想的

之所以用LinkedHashMap是为了遍历时不乱序

java 复制代码
   Map<Integer, String> map = new LinkedHashMap<>(){{
        put(1, "I");
        put(4, "IV");
        put(5, "V");
        put(9, "IX");
        put(10, "X");
        put(40, "XL");
        put(50, "L");
        put(90, "XC");
        put(100, "C");
        put(400, "CD");
        put(500, "D");
        put(900, "CM");
        put(1000, "M");
    }};

    public String intToRoman1(int num) {
        StringBuilder roman = new StringBuilder(); // 虽然线程不安全,但是快呀
        int original = num;
        while (original > 0) {
            int max = findMax(original);
            roman.append(map.get(max));
            original = original - max;
        }

        return roman.toString();
    }

    int findMax1(int num) {
        int res = 0;
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            if (entry.getKey() > num) {
                break; // 直接退出循环
            }else{
                res = entry.getKey();
            }
        }
        return res;
    }

很慢

使用数组代替map

java 复制代码
    int[] values = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
    String[] symbols = {
            "I", "IV", "V", "IX",
            "X", "XL", "L", "XC",
            "C", "CD", "D", "CM", "M"
    };


    // 59
    public String intToRoman2(int num) {
        StringBuilder roman = new StringBuilder(); // 虽然线程不安全,但是快呀
        while (num > 0) {
            int index = findMax2(num);
            roman.append(symbols[index]);
            num = num - values[index];
        }

        return roman.toString();
    }
    int findMax2(int num) {
        int res = 0;
       for (int i = 0; i < values.length; i++) {
           if (num < values[i]) {
               break;
           }else {
               res = i;
           }
       }
        return res;
    }

官解

感觉法二是差不多思路,只不过内外循环颠倒了下。

java 复制代码
int[] values3 = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] symbols3 = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

    public String intToRoman3(int num) {
        StringBuilder roman = new StringBuilder(); // 虽然线程不安全,但是快呀
        for(int i=0 ; i<symbols3.length ; i++) {
            int value = values3[i];
            String symbol = symbols3[i];
            while (num >= value) {
                roman.append(symbol);
                num -= value;
            }
            if(num == 0){
                break;
            }
        }

        return roman.toString();
    }
相关推荐
程序员JerrySUN几秒前
Linux内核驱动开发核心问题全解
linux·运维·驱动开发
武昌库里写JAVA2 分钟前
【MySQL】MySQL数据库如何改名
java·vue.js·spring boot·sql·学习
花落人散处1 小时前
SpringAI——接入高德MCP服务
java·后端
超浪的晨1 小时前
Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
java·开发语言·后端·学习·代理模式·个人开发
天天摸鱼的java工程师1 小时前
🧠 MySQL 索引结构有哪些?优缺点是什么?【原理 + 场景实战】
java·后端·面试
java叶新东老师1 小时前
idea提交时忽略.class、.iml文件和文件夹或目录的方法
java·开发语言
飞翔的佩奇1 小时前
Java项目:基于SSM框架实现的社区团购管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
java·数据库·vue.js·毕业设计·mybatis·答辩ppt·社区团购
TDengine (老段)2 小时前
TDengine 转化函数 TO_TIMESTAMP 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Warren982 小时前
Java Collections工具类
java·开发语言·笔记·python·学习·oracle·硬件工程
Joey_Chen2 小时前
【What · Why · How】浅析select/poll/epoll与IO多路复用
linux·服务器