• 作者: 负雪明烛
  • id: fuxuemingzhu
  • 个人博客:http://fuxuemingzhu.cn/
  • 个人公众号:负雪明烛
  • 本文关键词:roman, 罗马数字,题解,leetcode, 力扣,Python, C++, Java

题目描述

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

Symbol       Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

For example, two is written as II in Roman numeral, just two one’s added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9.
  • X can be placed before L (50) and C (100) to make 40 and 90.
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: 3
Output: "III"

Example 2:

Input: 4
Output: "IV"

Example 3:

Input: 9
Output: "IX"

Example 4:

Input: 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.

Example 5:

Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

题目大意

把一个整数转成罗马数字。

解题方法

考虑到这个题给出的数字的范围是1~3999,所以不用太复杂的考虑。

最简单的方法就是建立起一个对应关系,每个整数对应的数字是多少,然后把要查询的数字进行拆解,得到一系列数字的和,同时把一系列字符拼接成一个更长的字符串。

C++代码如下:

class Solution {
public:
string intToRoman(int num) {
string res = "";
vector<int> val{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
vector<string> str{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
for (int i = 0; i < val.size(); ++i) {
while (num >= val[i]) {
res += str[i];
num -= val[i];
}
}
return res;
}
};

Java代码如下:

package com.fuxuemingzhu.integertoroman;
/**
* Given an integer, convert it to a roman numeral.
* <p/>
* Input is guaranteed to be within the range from 1 to 3999.
* <p/>
* Created by fuxuemingzhu on 2015/9/4.
*/
public class Solution { static int value[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
static String symbol[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
/**
* 先存储好特定的数字,将输入的数字除以最大的特定数字,得到有几个最高为的数字,剩下的依次从次大数往下推。
*
* @return answer
*/
public static String intToRoman(int num) {
String ret = "";
int taps;
for (int i = 0; i < value.length; i++) {
taps = num / value[i];
if (taps >= 1) {
for (int j = 0; j < taps; j++) {
ret += symbol[i];
}
}
num -= taps * value[i];
}
return ret;
}
}

参考资料:

http://blog.csdn.net/ljiabin/article/details/39968583
http://blog.csdn.net/havenoidea/article/details/11848921
http://www.cnblogs.com/grandyang/p/4123374.html

日期

2015/9/4 16:40:35
2019 年 1 月 25 日 —— 这学期最后一个工作日

最新文章

  1. CentOS7系统安装及初始化
  2. BootStrap table使用
  3. IIS app pools, worker processes, app domains
  4. LintCode &quot;Copy Books&quot;
  5. Android小项目之十一 应用程序的主界面
  6. 标准MD5加密算法
  7. 帝国cms7.0设置标题图片(缺失状态下)
  8. 英文版Ubuntu安装Fcitx输入法
  9. BS导出csv文件的通用方法(.net)
  10. Linux入门——用户组管理
  11. 区块链 PoW 与 PoS 的纷争
  12. 使用Hash函数和MAC产生伪随机数
  13. SQLAlchemy——获取某列为空的数据
  14. (后端)Java跨域过滤器
  15. 完整的Django入门指南学习笔记4
  16. xshellDoc_1base
  17. Redis基于eval的多字段原子增量计算
  18. 基于RDBMS的OLAP的解决方案
  19. mysql 定时执行
  20. HTML5的video虽然可用controls来展示控件

热门文章

  1. 【R】clusterProfiler的GO/KEGG富集分析用法小结
  2. [Linux] 非root安装Lefse软件及其数据分析
  3. logname
  4. 远程登录Linux系统及上传下载文件
  5. 为 Rainbond Ingress Controller 设置负载均衡
  6. 日常Java测试第一段 2021/11/12
  7. 日常Java 2021/10/3
  8. addict, address, adequate.四级
  9. MyBatis中sql实现时间查询的方法
  10. 【编程思想】【设计模式】【结构模式Structural】组合模式composite