题目

罗马数字包含以下七种字符: 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
解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.

思路

那六种情况也就是说,只有当前者的值小于后者,才进行对前者的减法,所以只需要每次和下一个字符对比就行了,其他情况都是加法

代码

 1 class Solution {
 2 public:
 3     int romanToInt(string s) {
 4         int chang = s.size();
 5         int sum=0,index=0;
 6         for(index=0;;index++){
 7             if(index==chang-1){
 8                 sum+=getsum(s[index]);//注意别把index写成chang,因为chang是溢出的
 9                 break;
10             }
11             else{
12                 if(getsum(s[index])<getsum(s[index+1]))
13                     sum-=getsum(s[index]);
14                 else
15                     sum+=getsum(s[index]);
16             }
17
18         }
19
20     return sum;
21 }
22         int getsum(char c){
23             int num;
24             switch(c){
25                 case 'I':num=1;
26                     break;
27                 case 'V':num=5;
28                     break;
29                 case 'X':num=10;
30                     break;
31                 case 'L':num=50;
32                     break;
33                 case 'C':num=100;
34                     break;
35                 case 'D':num=500;
36                     break;
37                 case 'M':num=1000;
38                     break;
39
40             }
41             return num;
42         }
43
44
45 };

解释代码

22-42行用了一个函数,来对每一个罗马数字进行赋值,接着就是用这个函数来调用每个字母的值,最后返回调用的值也就是num。

3-21行的chang是确定输入罗马字符的长度,sum是总值,index是现在到字符的下标位置

7-8行是当index到最后一个位置时,也没有右边的值了,无需比较左右值大小,所以直接加上s【index】即可

11行是倘若没有到最后一个字符时的情况

12-13行首先判断是否左边的值小于右边的值,小于的话,就减去左边的值

14-15行  左边的值比右边值大的话,那就加上左边的值

20行的return sum是返回最后的总和,此时21行的大括号是第3行的那个,因为接下来的函数是自定义的,是属于第一行solution类中的。

收获

s.size,s为string类型时,是获取长度的

巧用自定义函数

switch case语句的语法需要总结下,因为发现自己这个不足,比如case后单引号,以及case加冒号

这道题的最高赞是用python的字典划分写的,果然是python快呀,不过条条大路通罗马,选择自己所选择的走下去就好

这道题从晚上6点多开始写,中间去操场跑步,锻炼,直到晚上10点多才写出来。不过运动后自己回来看代码的精神突然很集中,并且今天运动时候,又仿佛回到了大一时候打拳击的那种一往无前,乐观的态度,这段时间总是很丧,遇难而退,运动后的心态,让我变成了遇难而上,我不怕麻烦,也不怕写代码走弯路,最大的弯路就是怕走弯路,有两个词,一个叫功不唐捐,一个叫殊途同归。有了麻烦去解决麻烦,有困难去解决困难,方法总比困难多,生活中要有种乐观积极的态度来面对生活,需要认真对待生活,我爱生活。写代码同时也成为了我专注注意力以及认真思考的过程,我很享受代码从一无所知,让我通过搜索各种资料,通过各种途径,把它搞懂的感觉,我喜欢这种感觉。

本来这篇博客是22点多打算写的,但是中间有个新认识的同学我们商量了一个数据可视化的比赛,期间我在找数据,所以就拖延到现在,我还拖延了大概有个3,4篇leetcode题目没写,明天继续加油!

原题链接

13. 罗马数字转整数

转载于:https://www.cnblogs.com/vocoub/p/11570205.html

Leetcode13_罗马数字转整数相关推荐

  1. 【每日一算法】罗马数字转整数

    微信改版,加星标不迷路! 每日一算法-罗马数字转整数 作者:阿广 阅读目录 1 题目 2 解析 1 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1 V 5 ...

  2. LeetCode(13.罗马数字转整数) JAVA Hashmap

    LeetCode(13.罗马数字转整数) JAVA Hashmap 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D ...

  3. leetcode 两数之和 整数反转 回文数 罗马数字转整数

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  4. LeetCode 13罗马数字转整数14最长公共前缀

    罗马数字转整数 上一题是整数转罗马数字,这题是罗马数字转整数.虽然是简单题,但我感觉其实有点烦. 上一次是数字转字符,这次是字符转数字,总的来说大体思想还是差不多的. 首先整个字符串可能是这样构造的: ...

  5. 罗马数字 java_【leetcode刷题】[简单]13.罗马数字转整数(roman to integer)-java

    罗马数字转整数 roman to integer 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M ...

  6. LeetCode题 - 13 罗马数字转整数

    罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 I ...

  7. 20190913:(leetcode习题)罗马数字转整数

    罗马数字转整数 题目 大致思路 代码实现 题目 大致思路 跟上题一样,不需要思路,直接把各种情况列出来即可. 代码实现 package com.immunize.leetcode.romanTOINT ...

  8. 力扣——罗马数字转整数

    罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 I ...

  9. 每天Leetcode 刷题 初级算法篇-数学问题-罗马数字转整数

    题目要求: 力扣题解: 代码 /*** @program: mydemo* @description: 罗马数字转整数* @author: Mr.zeng* @create: 2021-02-24 0 ...

最新文章

  1. java二维数组矩阵_java使用二维数组开发五子棋
  2. 关于B站除夕夜被攻击
  3. 相当全面:推荐系统干货总结
  4. 打趴系统的不一定是技术
  5. appium的desired_caps参数
  6. SAP Spartacus应用入口的模块加载单步调试
  7. 循环队列的java结构_Java数据结构——循环队列
  8. 内外分离接口依赖及UIScrollView知识点
  9. r9270公版bios_显卡成功刷入UEFI GOP BIOS 彻底解决开机扁苹果
  10. UG与PM数控编程的区别在哪
  11. 2020年06月16日_万金油_新浪博客
  12. 数学建模常用模型04 :灰色关联分析法
  13. 达摩院高清人像美肤模型ABPN CVPR论文深入解读
  14. 2023年1月21日除夕活动取消通知
  15. Discriminative Feature Learning for Unsupervised Video Summarization(论文翻译)
  16. PL/SQL教程:PL/SQL Developer使用技巧
  17. iphone复制不能全选_iphone长按键盘进行复制、粘贴、全选操作技巧
  18. 连续三次世界500强面试经历
  19. 分到用时方恨少--CSDN赚积分办法
  20. 程序员上了年纪可以做啥?

热门文章

  1. [附源码]JAVA+ssm计算机毕业设计高校网上报销系统(程序+Lw)
  2. 笔记本跑linux续航,大年初一发售 System76推15.6吋超薄长续航Linux笔记本Darter Pro
  3. http1.0协议简介
  4. Http状态码大全(404、500、505等)
  5. 【数据结构与算法】Manacher算法
  6. 需要!男朋友快来找我。
  7. python 数据归一化/标准化方法与代码(离差标准化,log归一化,标准化,比例归一化,反正切归一化)
  8. Deepin Linux安装
  9. UOJ 73 [WC2015]未来程序
  10. Python分析网易云音乐近5年热门歌单