这题真是送分——LeetCode题目12:整数转罗马数字
原题描述
+
罗马数字包含以下七种字符: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
原题链接:https://leetcode-cn.com/problems/integer-to-roman
思路解析
+
我其实一直不理解这道题有什么可做的,而且做题的时候总有一种用人民币凑钱的感觉。
言归正传,虽然方法其实很多,但是从时间复杂度和空间复杂度角度上讲都没有什么本质差别。这里我简单说一下我的思路,我相信这也是大部分人想到的思路。
首先罗马数字也是从左到右按照从高位到低位排列的,这意味着我们可以将阿拉伯数字从高位到低位逐个转换,但转换的时候需要考虑两件事。
1. 当前待转换数字所处的数位,比如是十分位还是百分位等;
2 当前待转换数字的数值。
因为在转换的过程中不但要结合数位,还要对各种数字分情况考虑。比如:
如果数位是1~3,那么简单堆叠即可;
如果数位是4或9,那么需要通过5-1和10-1来实现;
如果数位是5~8,那么需要通过5+n来实现,其中n一定是简单堆叠;
如果数位是0,直接跳过即可(这条很容易被忽略)。
对于题目给定的基本转换规则我们可以通过哈希表事先存起来,并且表的大小不随问题规模的变化而变化。
复杂度分析
+
- 时间复杂度:
- 空间复杂度:
C++参考代码
+
class Solution {
public:
string intToRoman(int num) {
string res = "";
map<int, string> table = {
{1, "I"}, {5, "V"}, {10, "X"}, {50, "L"},
{100, "C"}, {500, "D"}, {1000, "M"}
};
int base = 1;
while (num / (base * 10)) base *= 10;
while (num) {
int digit = num / base;
if (digit >= 1 && digit <= 3) {
int other = digit;
while (other) {
res += table[base];
--other;
}
} else if (digit == 4) {
res += table[int(base)];
res += table[int(base * 5)];
} else if (digit >= 5 && digit < 9) {
res += table[base * 5];
int other = digit - 5;
while (other) {
res += table[base];
--other;
}
} else if (digit == 9) {
res += table[int(base)];
res += table[int(base * 10)];
}
num -= base * digit;
base /= 10;
}
return res;
}
};
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- meta生成器 —— 表单元素组件 meta表单代码meta的模板data变幻
- 不用写代码也能做表单 —— 加载meta即可 菜单表单加载json运行效果。ModelAbout
- 从0到1,手把手教你入门 etcd
- 数据结构:手把手带你了解 ”图“ 所有知识!(含DFS、BFS)
- 设计模式之单例模式
- AndroidStudio创建JNI 工程与调用
- Java 版植物大战僵尸思路和源码分享!
- 你好MyBatis 入门篇
- 你好MyBatis 中级篇
- 你好MyBatis 中高级篇
- Nginx反代理获取真实IP
- 你好MyBatis 高级篇
- redis实现分布式锁:他说,他的分布式锁,很润哦
- Python_字符串
- DBeaver链接ClickHouse