文章目录
- 写在前面
- Tag
- 题目来源
- 解题思路
- 方法一:模拟
- 写在最后
写在前面
本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……
专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:
- Tag:介绍本题牵涉到的知识点、数据结构;
- 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
- 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
- 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
- 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。
Tag
【字符串】【模拟】
题目来源
12. 整数转罗马数字
解题思路
方法一:模拟
思路
根据罗马数字的唯一表示,为了表示一个给定的整数 num
,我们寻找不超过 num
的最大符号值,将 num
减去该符号值,然后继续寻找不超过 num
的最大符号值,将该符号值拼接在上一个找到的符号之后,循环处理直至 num
为 0。最后得到的字符串即为 num
的罗马数字表示。
罗马数字符号
罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则给出了额外的 6 个复合字符。这样一共就有 13 个独特的符号。如下图所示:
代码
const pair<int, string> valueSymbols[] = {
{1000, "M"},
{900, "CM"},
{500, "D"},
{400, "CD"},
{100, "C"},
{90, "XC"},
{50, "L"},
{40, "XL"},
{10, "X"},
{9, "IX"},
{5, "V"},
{4, "IV"},
{1, "I"},
};
class Solution {
public:
string intToRoman(int num) {
string roman;
for (const auto &[value, symbol] : valueSymbols) {
while (num >= value) {
num -= value;
roman += symbol;
}
if (num == 0) {
break;
}
}
return roman;
}
};
复杂度分析
时间复杂度: O ( 1 ) O(1) O(1)。根据本题数据范围,循环次数不会超过 15 次,可以看做是常数时间。
空间复杂度: O ( 1 ) O(1) O(1)。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。