当前位置: 首页 > news >正文

【leetcode面试经典150题】18.整数转罗马数字(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用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 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;}
};// 方法二:编码  //利用模运算和除法运算,我们可以得到 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];}
};
http://www.lryc.cn/news/333879.html

相关文章:

  • NLopt
  • 三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型
  • 创建spring boot项目
  • Mongodb字段更新操作符$currentDate
  • 通信安全之数据加密
  • 花一分钟简单认识 CSS 中的规则 —— 级联层 @layer
  • K8s学习三(Pod与探针)
  • leetcode - 678. Valid Parenthesis String
  • 索尼相机照片清理软件
  • 比赛记录:Codeforces Global Round 25 A~E (猜猜题场)
  • Windows系统安装OpenSSH结合VS Code远程ssh连接Ubuntu【内网穿透】
  • Svg Flow Editor 原生svg流程图编辑器(五)
  • 数字晶体管选型参数,结构原理,工艺与注意问题总结
  • lua学习笔记9(字典的学习)
  • 第六篇: 3.5 性能效果 (Performance)- IAB/MRC及《增强现实广告效果测量指南1.0》
  • mysql学习笔记NO.2
  • C++11:lambda表达式 包装器
  • Node.js HTTP/2 CONTINUATION 拒绝服务漏洞(CVE-2024-27983)
  • YOLOV8 + 双目测距
  • 前端:SVG绘制流程图
  • 【Linux系列】如何确定当前运行的是 RHEL 9 还是 RHEL 8?
  • vscode开发java的插件和配置
  • Mysql启动报错:本地计算机上的mysql服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止
  • WPF程序添加托盘图标
  • 工业4g路由器联网后迅速掉线是什么原因?
  • 腾讯云4核8G服务器12M带宽646元1年零3个月,4C8G使用场景说明
  • java - 读取配置文件
  • Ubuntu22.04平台编译完美解决问题“error: GLSL 4.5 is not supported.”【GLSL(OpenGL着色器语言)】
  • 数据结构之搜索二叉树与关联性容器初接触
  • C语言整数和小数的存储