2019独角兽企业重金招聘Python工程师标准>>>

问题:

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

解决:

【注】

基本字符

I

V

X

L

C

D

M

相应的阿拉伯数字表示为

1

5

10

50

100

500

1000

例如整数 1437 的罗马数字为 MCDXXXVII, 我们不难发现,千位,百位,十位和个位上的数分别用罗马数字表示了。 1000 - M, 400 - CD, 30 - XXX, 7 - VII。所以我们要做的就是用取商法分别提取各个位上的数字,然后分别表示出来:
【罗马数字】
1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
1000~3000: {"M", "MM", "MMM"}.

设数字与罗马数字之间的对应关系:roman[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
以100~900为例,我们可以分为四类:100到300一类res += roman[n],400一类res += roman[n]+roman[n-1],500到800一类res += roman[n - 1] + roman[n],900最后一类res+=roman[n] + roman[n-2]。每一位上的情况都是类似的,代码如下:

① 使用代码实现转换。

class Solution { //91ms
    public static String intToRoman(int num) {
        String res = "";
        char[] roman = {'M','D','C','L','X','V','I'};
        int[] value = {1000,500,100,50,10,5,1};
        for (int i = 0;i < 7;i += 2){//遍历roman数组
            int val = num / value[i];
            if (val < 4){
                for (int j = 1;j <= val;j ++){
                    res = res + roman[i];
                }
            }else if(val == 4){
                res = res + roman[i] + roman[i - 1];
            }else if (val > 4 && val < 9){
                res = res + roman[i - 1];
                for (int j = 6;j <= val;j ++){
                    res += roman[i];
                }
            }else if (val == 9){
                res = res + roman[i] + roman[i - 2];//若使用res += res + roman[i] + roman[i - 2]结果为161,变为了整数相加
            }
            num %= value[i];
        }
        return res;
    }
}

② 本题由于限制了输入数字范围这一特殊性,故而还有一种利用贪心算法的解法,建立一个数表,每次通过查表找出当前最大的数,减去再继续查表。

public class Solution { //93ms
    private static final String[] ROMAN = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    private static final int[] INTEGERS = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        int index = 0;
        while (num > 0) {
            while (num >= INTEGERS[index]) {
                sb.append(ROMAN[index]);
                num -= INTEGERS[index];
            }
            index ++;
        }
        return sb.toString();
    }
}

③一种讨巧的做法,将所有的可能都列出来。

public class Solution {//95ms
    public String intToRoman(int num) {
        String M[] = {"", "M", "MM", "MMM"};
        String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
        String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
        String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
        return M[num / 1000] + C[(num % 1000) / 100] + X[(num % 100) / 10] + I[num % 10];
    }
}

转载于:https://my.oschina.net/liyurong/blog/1523710

整数转换为罗马数字 Integer to Roman相关推荐

  1. 将阿拉伯数字转换成罗马数字 Integer to Roman

    题目源自于leetcode. 题目:将一个int型的阿拉伯数字转换为string型的罗马数字. 方法:首先要知道罗马数字的表示法. 个位.十位.百位.千位都是特点的字幕作为权值,每一个位的10个数字的 ...

  2. php数字转换题目,PHP将整数数字转换为罗马数字实例分享

    方法一:自定义函数 我们可以自己手动编写一个函数来实现此功能,这个函数可以将数字作为第一个参数,将其转换为罗马并返回. 注:大多数算法只能在1-4999的范围内工作,如果使用特大数,脚本将失败. 实现 ...

  3. Leetcode No.12 整数转罗马数字

    题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符          数值 I             1 V             5 X             ...

  4. 算法:整数转罗马数字(integer-to-roman)。

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...

  5. lintcode :Integer to Roman 整数转罗马数字

    题目 整数转罗马数字 给定一个整数,将其转换成罗马数字. 返回的结果要求在1-3999的范围内. 样例 4 -> IV 12 -> XII 21 -> XXI 99 -> XC ...

  6. LeetCode 12 Integer to Roman (整数转罗马数字)

    题目链接: https://leetcode.com/problems/integer-to-roman/?tab=Description String M[] = {"", &q ...

  7. Integer to Roman 问题

    Integer to Roman 问题 leetcode java 1.问题描述 Given an integer, convert it to a roman numeral.Input is gu ...

  8. lintcode 418整数转罗马数字

    描述 给定一个整数,将其转换成罗马数字. 返回的结果要求在1-3999的范围内. 说明 https://en.wikipedia.org/wiki/Roman_numerals https://zh. ...

  9. Java - 将整数转换为字符串[duplicate]

    本文翻译自:Java - Convert integer to string [duplicate] This question already has an answer here: 这个问题在这里 ...

最新文章

  1. android 获取视频大小,Android 获取视频缩略图(获取视频每帧数据)的优化方案
  2. JDK ThreadPoolExecutor核心原理与实践
  3. 爱思助手安卓能用吗_手机资讯:【爱思助手6.0】音乐铃声导入教程
  4. MySQL数据库:读写分离
  5. 平安iq测试没通过的话影响入职吗_从外包测试到阿里巴巴,一位三本女生逆袭之路...
  6. java百度地图添加标注_调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注...
  7. 复习知识点:UITableView和UICollectionView的常用属性
  8. 请问WCF 跟 WebService之间异同
  9. 【Flink】Could not connect to BlobServer at address
  10. Vscode在Windows上配置远程开发
  11. 2018北京java面试心得体会(一年经验)
  12. 给大家爆个秘密:怎样迅速提高你的校内人人网人气
  13. win ollvm环境_打造舒适搬砖环境,这些是我最想推介的桌面好物
  14. C语言入门——初识C语言
  15. Dubbo (五) ---------监控中心
  16. Paste for Mac(剪切板历史管理工具)
  17. 常见网站聊天工具链接
  18. 郑院士:章子怡是谁?
  19. 讯捷FW150US Ubuntu 13.04 驱动
  20. 10 个免费的服务器监控工具

热门文章

  1. ssl以及构建私有CA
  2. POJ 3468 A Simple Problem with Integers
  3. Symbian的内存管理机制
  4. 在C++工程中设置全局函数
  5. 如何避免jquery库和其它库的冲突
  6. Freebsd 下用 sshguard 防止暴力破解 ssh 密码
  7. Bitcoin ABC发布11月BCH升级要点,快看做了哪些改变?
  8. Robinhood应用宣布添加BCH和LTC交易
  9. Redis热点Key发现及常见解决方案
  10. Q新闻丨MongoDB更换开源协议;Redis 5.0、Angular 7.0发布