【简单算法】43.罗马数字转整数

题目:

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

输入: "III"
输出: 3
示例 2:

输入: "IV"
输出: 4
示例 3:

输入: "IX"
输出: 9
示例 4:

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

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

代码实现:

class Solution {
public:
    int romanToInt(string s) {
        int tagVal[256];
        tagVal[‘I‘] = 1;
        tagVal[‘V‘] = 5;
        tagVal[‘X‘] = 10;
        tagVal[‘C‘] = 100;
        tagVal[‘M‘] = 1000;
        tagVal[‘L‘] = 50;
        tagVal[‘D‘] = 500;
        int val = 0;
        for(int i = 0; i < s.length(); i++){
            if(i+1 >= s.length() || tagVal[s[i+1]] <= tagVal[s[i]])
                val += tagVal[s[i]];
            else
                val -= tagVal[s[i]];
        }
        return val;
    }
};

原文地址:https://www.cnblogs.com/mikemeng/p/9000201.html

时间: 2024-10-11 06:24:40

【简单算法】43.罗马数字转整数的相关文章

C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数

各位相加 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所以返回 2. 进阶:你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗? 题目地址 https://leetcode-cn.com/problems/add-digits/ 代码模板 public class Solution { public int AddDigits

1136: 零起点学算法43——多组测试数据输出I

1136: 零起点学算法43--多组测试数据输出I Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: 1541  Accepted: 1139[Submit][Status][Web Board] Description 掌握了输入之后,我们看下多组测试数据输出的情况. 一般情况下,对于每一组数据输入后先处理然后输出结果,再输入第2组数据,输出仅仅是换行而已 int main() { int a,b

罗马数字与整数相互转化

leetcode中的题目 直接上代码: 1 def int2roman(num): 2 ret = "" 3 lists = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) 4 chars = ("M", "CM", "D", "CD", "C", "XC", "L", "XL

普林斯顿公开课 算法4-3:堆排

堆排的灵感源自于堆的数据结构.它是一种原地排序算法,不需要额外的临时数组. 基本思想 堆排的基本思想是: 先建立一个最大堆 将最大的元素移动到数组末尾,减小堆的大小,调整最大堆使其符合最大堆的性质 重复第二步,直到最大堆耗尽为止 第一个步骤建立最大堆的代码非常简单,只要对每个节点执行sink操作即可. 1 2 for(int k = N/2; k >= 1; k--)     sink(a, k, N); 第二个步骤也很简单,代码如下: 1 2 3 4 while(N > 1) {     e

根据权重挑选通道的简单算法

当存在一批通道,根据权重,选择哪个通道去使用的简单算法. 利用随机数,数据区间,来获取通道. 通道权重越大,单位时间内使用该通道的概率会大一些. 代码 1 //利用了一个权重区间的比例问题,抓取随机数的可能性,来体现权重思想 2 public static void main(String[] args) { 3 //定义三个通道的权重,按随机数选拔使用哪个通道. 4 //A 10 B 70 C 30 5 //从数据库查询出list集合 6 ChannelD A=new ChannelD("A&

【线性表基础】基于线性表的简单算法【Java版】

本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeRepeat(LinkList L) { Node node = L.head.next; // 首结点 while (node != null) // 一重循环,遍历L中的每一个元素 { // Object data=p.data; Node p = node; // q结点的前驱 Node q =

图的所有简单算法实现

包括邻接链表.有向无向图.带权图.增删顶点和边.查找.连通.DFS和BFS等.这只是一个最初版本,有些复杂的算法还没有实现. package structure; //图的邻接链表的节点 public class GraphListNode { private int vertex;//图的顶点 private int weight;//边的权重 private boolean visited;//是否访问过 //带权重图的节点 public GraphListNode(int vertex,i

经典算法之判断一个整数是否为素数

经典算法之判断一个整数是否为素数 1 /** 2 判断一个数是否为素数 如: 3 输入: 任意一个数 12 4 输出: 1或0(1表示为素数) 0 5 */ 6 /**************被称为笨蛋的做法************/ 7 #include <stdio.h> 8 9 int main() 10 { 11 12 int i,n; //i为计数数,n为存储用户输入的数 13 14 do //循环检测用户输入的数据>0为合法 15 scanf("%d",&

如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算

package interview_10_10; import org.junit.Test; public class T1 { /** * 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算). */ @Test public void test1() { String number1 = "4324328732789"; String number2 = "2383244324324325898