LeetCode 12. 整数转罗马数字(Integer to Roman)

题目描述

罗马数字包含以下七种字符: 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。

给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。

示例 1:

输入: 3
输出: "III"

示例 2:

输入: 4
输出: "IV"

示例 3:

输入: 9
输出: "IX"

示例 4:

输入: 58
输出: "LVIII"
解释: C = 100, L = 50, XXX = 30, III = 3.

示例 5:

输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

解题思路

首先定义一个映射关系,使得从1到1000且包括6种特殊数字的共13个基本数字对应其罗马数字。接着从大到小遍历各数字,对于每个数字若其不大于num,则在结果中放置其对应的罗马数字,并将num减去该数字,然后继续与该数字比较。若其大于num,则再继续向前比较直到num减为0.

代码

 1 class Solution {
 2 public:
 3     string intToRoman(int num) {
 4         map<int, string> inToStr;
 5         inToStr[1] = "I";
 6         inToStr[4] = "IV";
 7         inToStr[5] = "V";
 8         inToStr[9] = "IX";
 9         inToStr[10] = "X";
10         inToStr[40] = "XL";
11         inToStr[50] = "L";
12         inToStr[90] = "XC";
13         inToStr[100] = "C";
14         inToStr[400] = "CD";
15         inToStr[500] = "D";
16         inToStr[900] = "CM";
17         inToStr[1000] = "M";
18         int nums[13] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
19         string res = "";
20         int idx = 12;
21         while(num){
22             if(num >= nums[idx]){
23                 res += inToStr[nums[idx]];
24                 num -= nums[idx];
25             }
26             else idx--;
27         }
28         return res;
29     }
30 };

原文地址:https://www.cnblogs.com/wmx24/p/9190937.html

时间: 2024-08-24 12:23:25

LeetCode 12. 整数转罗马数字(Integer to Roman)的相关文章

[leetcode] 12. 整数转罗马数字

12. 整数转罗马数字 字符串处理,题超级简单,读懂题直接开干就行. 基本思路就是从大往小一点一点的来表示,具体看代码把: class Solution { public: string intToRoman(int num) { string ans = ""; int m = 0; m = num / 1000; for (int i = 0; i < m; i++) { ans += 'M'; } num %= 1000; if (num >= 900) { ans

LeetCode 12 - 整数转罗马数字 - [简单模拟]

题目链接:https://leetcode-cn.com/problems/integer-to-roman/ 题解: 把 $1,4,5,9,10,40,50, \cdots, 900, 1000$ 均看做档位,优先转化大的档位,直到不能转化为止,然后降一个档位,继续转化,反复如此直到 $num=0$. AC代码: struct Solution { int o[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; string mp[13]; Solu

leetcode 12 整数转罗马数字 贪心

额,连着两个贪心? 这是局部最优问题:能用大“罗马数表示”就不会用小的. 先构造出所有基础罗马数,然后从大到小比较 因为比较的只有1000,900,...有限并有些麻烦,构造table  map<int,string> 然后,map默认安装按照key的值升序排序.. 想从大到小,用reverse_iterator class Solution { public: string intToRoman(int num) { map<int,string> calc = {{1000,&

【leetcode刷题笔记】Integer to Roman

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 题解:基本的罗马字符和数字对应如下表所示: 罗马字符 数字 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 每隔一个字符又可以与相邻的两个字符组成一个新的数,例如I可以和V和X组成IV和IX,这样又可以生成6个数字,如下表: 罗马字符 数字 IV 4 IX

【算法】【LeetCode】整数转罗马数字

题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII ,即为 X + II . 27 写做  XXVII, 即为 XX + V + II . 通常情况下,罗马数字中小的数字在大的数字的右边.但也存在特例,例如 4 不写做 IIII,而是 IV.数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 .同样

【LeetCode从零单刷】Integer to Roman

题目: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999. 解答: 慢慢模拟也可以.应该不会错.这里介绍一种"查表+ 拼接字符串"的方法. class Solution { public: string thousand[4] = {"", "M", "MM", &

LeetCode 12 int转罗马数字

class Solution { public: string intToRoman(int num) { string M[] = {"", "M", "MM", "MMM"}; //千位,从1000到三千 string C[] = {"", "C", "CC", "CCC", "CD", "D", &qu

12.整数转罗马数字

题目描述: 解法: 贪心法 class Solution { public: string intToRoman(int num) { vector<int> number = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; vector<string> roman={"M","CM","D","CD","C","XC",&

LeetCode 12 Integer to Roman (整数转罗马数字)

题目链接: https://leetcode.com/problems/integer-to-roman/?tab=Description String M[] = {"", "M", "MM", "MMM”};//1000~3000String C[] = {"", "C", "CC", "CCC", "CD", "D&quo