网站制作不用备案,做一个网站中的搜索功能怎么做,海外转运网站建设,微信开发者工具在哪里下载【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主#xff0c;题解使用C语言。#xff08;若有使用其他语言的同学也可了解题解思路#xff0c;本质上语法内容一致题解使用C语言。若有使用其他语言的同学也可了解题解思路本质上语法内容一致 【题目描述】
罗马数字包含以下七种字符 I V X LCD 和 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。
给你一个整数将其转为罗马数字。
【示例一】
输入: num 3
输出: III
【示例二】
输入: num 4
输出: IV
【示例三】
输入: num 9
输出: IX
【示例四】
输入: num 58
输出: LVIII
解释: L 50, V 5, III 3.
【示例五】
输入: num 1994
输出: MCMXCIV
解释: M 1000, CM 900, XC 90, IV 4.
【提示及数据范围】
1 num 3999
【代码】
// 方法一模拟// 根据罗马数字的唯一表示法为了表示一个给定的整数 num我们寻找不超过 num 的最大符号值
// 将 num 减去该符号值然后继续寻找不超过 num 的最大符号值
// 将该符号拼接在上一个找到的符号之后循环直至 num 为 0。
// 最后得到的字符串即为 num 的罗马数字表示。const pairint, 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;}
};// 方法二编码 //利用模运算和除法运算我们可以得到 num 每个位上的数字
// thousands_digit num / 1000
// hundreds_digit (num % 1000) / 100
// tens_digit (num % 100) / 10
// ones_digit num % 10const string thousands[] {, M, MM, MMM};
const string hundreds[] {, C, CC, CCC, CD, D, DC, DCC, DCCC, CM};
const string tens[] {, X, XX, XXX, XL, L, LX, LXX, LXXX, XC};
const string ones[] {, I, II, III, IV, V, VI, VII, VIII, IX};class Solution {
public:string intToRoman(int num) {return thousands[num / 1000] hundreds[num % 1000 / 100] tens[num % 100 / 10] ones[num % 10];}
};