罗马数字 java_Java算法练习——整数转罗马数字

题目描述

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符

数值

I

1

V

5

X

10

L

50

C

100

D

500

M

1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。

X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。

C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

示例 1

输入: 3

输出: "III"

示例 2

输入: 4

输出: "IV"

示例 3

输入: 9

输出: "IX"

示例 4

输入: 58

输出: "LVIII"

解释: L = 50, V = 5, III = 3.

示例 5

输入: 1994

输出: "MCMXCIV"

解释: M = 1000, CM = 900, XC = 90, IV = 4.

题解

public String intToRoman(int num) {

Map lookup = new LinkedHashMap<>();

lookup.put(1000, "M");

lookup.put(900, "CM");

lookup.put(500, "D");

lookup.put(400, "CD");

lookup.put(100, "C");

lookup.put(90, "XC");

lookup.put(50, "L");

lookup.put(40, "XL");

lookup.put(10, "X");

lookup.put(9, "IX");

lookup.put(5, "V");

lookup.put(4, "IV");

lookup.put(1, "I");

StringBuilder res = new StringBuilder();

for (Integer key : lookup.keySet()) {

int n = num / key;

if (n == 0) continue;

for (int i = n; i > 0; i--) {

res.append(lookup.get(key));

}

num -= n * key;

if (num == 0) {

break;

}

}

return res.toString();

}

复杂度分析

时间复杂度:$O(n)$,虽然是两个循环,但是第二个循环次数最大为3。

空间复杂度:$O(n)$。

手记

LinkedHashMap 可以按插入顺序存放键值对。

PHP算法之整数转罗马数字

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

Java算法练习——整数反转

题目链接 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 备注 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 $[−2^{31}, 2^ ...

Java实现 LeetCode 12 整数转罗马数字

12. 整数转罗马数字 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...

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

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

java算法 蓝桥杯 高精度加法

问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

java算法 蓝桥杯 文化之旅

问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

java算法 蓝桥杯 摆花

问题描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

LeetCode:整数转罗马数字【12】

LeetCode:整数转罗马数字[12] 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 10 ...

[LeetCode] 12. Integer to Roman 整数转为罗马数字

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

随机推荐

POJ1753 Flip Game(bfs、枚举)

链接:http://poj.org/problem?id=1753 Flip Game Description Flip game is played on a rectangular 4x4 fie ...

JAVA Day8

1. 引用数据类型需要new 2. 字符串使用的3种方式 String s = "hello world"; String s = new String(); String s = ...

U3D事件系统总结

事件系统有三个要素:发送者,接收者, 转发者. 发送者有两种,一是相机,二是画布.发送者是事件的管理者,发起者,它们使用射线发射器来检测点击事件: 相机的physics Raycaster. 画面的C ...

for in 在数组和json中

数组中也有for--in,相较于对象中的用法是有区别的:数组中 var arr = ['曹操','曹植','曹丕'] for(i in arr){ console.log(i) //0 1 2 con ...

[LOJ3086][GXOI/GZOI2019]逼死强迫症——递推+矩阵乘法

题目链接: [GXOI/GZOI2019]逼死强迫症 设$f[i][j]$表示前$i$列有$j$个$1*1$的格子的方案数,那么可以列出递推式子: $f[i][0]=f[i-1][0]+f[i-2][ ...

python3 urllib模块使用

urllib模块使用 urllib.request urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=N ...

ASP.NET MVC:无法向会话状态服务器发出会话状态请求

ylbtech-Error-ASP.NET MVC: 无法向会话状态服务器发出会话状态请求 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Service (ASP.NET ...

js 每隔四位加一个空格

var str = '2016060520103600466'; var str=str.replace(/\s/g,'').replace(/(.{4})/g,"$1 "); a ...

[Erlang24]使用zotonic搭建网站记录

zotonic的搭建网站(blog)记录:   zotonic:用Erlang做的一个web 框架:   和wordpress 类似,但是官网称比PHP CMS要快10倍以上   先看看我的成果:正弦 ...

php-fpm 操作命令

以下内容转自 https://www.cnblogs.com/alibai/p/4070076.html 和 https://blog.csdn.net/wzx19840423/article/det ...

你可能感兴趣的:(罗马数字,java)