整数转换为罗马数字 Integer to Roman
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相关推荐
- 将阿拉伯数字转换成罗马数字 Integer to Roman
题目源自于leetcode. 题目:将一个int型的阿拉伯数字转换为string型的罗马数字. 方法:首先要知道罗马数字的表示法. 个位.十位.百位.千位都是特点的字幕作为权值,每一个位的10个数字的 ...
- php数字转换题目,PHP将整数数字转换为罗马数字实例分享
方法一:自定义函数 我们可以自己手动编写一个函数来实现此功能,这个函数可以将数字作为第一个参数,将其转换为罗马并返回. 注:大多数算法只能在1-4999的范围内工作,如果使用特大数,脚本将失败. 实现 ...
- Leetcode No.12 整数转罗马数字
题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X ...
- 算法:整数转罗马数字(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 ,即为两个并 ...
- lintcode :Integer to Roman 整数转罗马数字
题目 整数转罗马数字 给定一个整数,将其转换成罗马数字. 返回的结果要求在1-3999的范围内. 样例 4 -> IV 12 -> XII 21 -> XXI 99 -> XC ...
- LeetCode 12 Integer to Roman (整数转罗马数字)
题目链接: https://leetcode.com/problems/integer-to-roman/?tab=Description String M[] = {"", &q ...
- Integer to Roman 问题
Integer to Roman 问题 leetcode java 1.问题描述 Given an integer, convert it to a roman numeral.Input is gu ...
- lintcode 418整数转罗马数字
描述 给定一个整数,将其转换成罗马数字. 返回的结果要求在1-3999的范围内. 说明 https://en.wikipedia.org/wiki/Roman_numerals https://zh. ...
- Java - 将整数转换为字符串[duplicate]
本文翻译自:Java - Convert integer to string [duplicate] This question already has an answer here: 这个问题在这里 ...
最新文章
- android 获取视频大小,Android 获取视频缩略图(获取视频每帧数据)的优化方案
- JDK ThreadPoolExecutor核心原理与实践
- 爱思助手安卓能用吗_手机资讯:【爱思助手6.0】音乐铃声导入教程
- MySQL数据库:读写分离
- 平安iq测试没通过的话影响入职吗_从外包测试到阿里巴巴,一位三本女生逆袭之路...
- java百度地图添加标注_调取百度地图接口,实现取自己的实时位置,然后可以在百度地图上添加信息标注...
- 复习知识点:UITableView和UICollectionView的常用属性
- 请问WCF 跟 WebService之间异同
- 【Flink】Could not connect to BlobServer at address
- Vscode在Windows上配置远程开发
- 2018北京java面试心得体会(一年经验)
- 给大家爆个秘密:怎样迅速提高你的校内人人网人气
- win ollvm环境_打造舒适搬砖环境,这些是我最想推介的桌面好物
- C语言入门——初识C语言
- Dubbo (五) ---------监控中心
- Paste for Mac(剪切板历史管理工具)
- 常见网站聊天工具链接
- 郑院士:章子怡是谁?
- 讯捷FW150US Ubuntu 13.04 驱动
- 10 个免费的服务器监控工具