给定一个罗马数字,将其转换成整数。

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/roman-to-integer

初步分析
  1. 将各类情况放入哈希表,逐个查询表中符合的情况。
  2. 归纳特殊情况加减关系。

本章总结

【小总结】
1.【哈希表的使用】
2.【关系的归纳】

详细代码

哈希表版
public class Solution {public int RomanToInt(string s) {int sum = 0;Dictionary<string, int> dic = new Dictionary<string, int>();dic.Add("I", 1);dic.Add("IV", 4);dic.Add("V", 5);dic.Add("IX", 9);dic.Add("X", 10);dic.Add("XL", 40);dic.Add("L", 50);dic.Add("XC", 90);dic.Add("C", 100);dic.Add("CD", 400);dic.Add("D", 500);dic.Add("CM", 900);dic.Add("M", 1000);for (int i = s.Length-1; i >=0 ; i--){if (i > 0){if (dic.ContainsKey(s[i - 1].ToString() + s[i].ToString())){sum = sum + dic[s[i - 1].ToString() + s[i].ToString()];i--;}elsesum = sum + dic[s[i].ToString()];}else{sum = sum + dic[s[i].ToString()];}             }return sum;}
}
关系归纳版
public class Solution {public int RomanToInt(string s) {int sum = 0;int preNum = getValue(s[0]);for(int i = 1;i < s.Length; i ++) {int num = getValue(s[i]);if(preNum < num) {sum -= preNum;} else {sum += preNum;}preNum = num;}sum += preNum;return sum;}private int getValue(char ch) {switch(ch) {case 'I': return 1;case 'V': return 5;case 'X': return 10;case 'L': return 50;case 'C': return 100;case 'D': return 500;case 'M': return 1000;default: return 0;}}
}
 位运算符:(a & b)按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0输出结果 12 ,二进制解释: 0000 1100(a | b)按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。输出结果 61 ,二进制解释: 0011 1101(a ^ b)按位异或运算符:当两对应的二进位相异时,结果为1输出结果 49 ,二进制解释: 0011 0001(~a )按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。a << 2左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。输出结果 240 ,二进制解释: 1111 0000a >> 2右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数输出结果 15 ,二进制解释: 0000 1111赋值运算符:*= 乘法赋值运算符 c *= a 等效于 c = c * a/= 除法赋值运算符 c /= a 等效于 c = c / a%= 取模赋值运算符 c %= a 等效于 c = c % a**= 幂赋值运算符 c **= a 等效于 c = c ** a//= 取整除赋值运算符 c //= a 等效于 c = c // a

作者:boywithacoin_cn
链接:https://leetcode-cn.com/problems/reverse-integer/solution/pythondan-chu-he-tui-ru-shu-zi-yi-chu-qian-jin-xin/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以下是个人初步版本垃圾代码仅供参考

public class Solution {public int RomanToInt(string s) {Stack<char> stack = new Stack<char>(s.Length);int sum = 0;for (int i = s.Length - 1; i >= 0; i--){switch (s[i]){case 'I':{if (stack.Count==0|| (stack.Peek() != 'V' && stack.Peek() != 'X'))sum = sum + 1;elsesum = sum - 1;break;}case 'V':sum = sum + 5;break;case 'X':{if (stack.Count == 0 || (stack.Peek() != 'L' && stack.Peek() != 'C'))sum = sum + 10;elsesum = sum - 10;break;}case 'L':sum = sum + 50;break;case 'C':{if (stack.Count == 0 || (stack.Peek() != 'D' && stack.Peek() != 'M'))sum = sum + 100;elsesum = sum - 100;break;}case 'D':sum = sum + 500;break;case 'M':sum = sum + 1000;break;}stack.Push(s[i]);}return sum;}
}

【罗马数字转整数】算法优化笔记相关推荐

  1. 【整数反转】算法优化笔记

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21 假设我们 ...

  2. 【回文数】算法优化笔记

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数(不将整数转为字符串来解决). 示例 1:输入: 121输出: true示例 2:输入: -121输出: fals ...

  3. 【两数之和】算法优化笔记

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

  4. 【斐波那契数列】算法优化笔记

    题目:斐波那契数列为:1,1,2,3,5,8-,求第n项? 初步分析 设an为斐波那契数列. a1=a2=1;(n<=2) an=a(n-1) + a(n-2);(n>=2) 本章总结 [ ...

  5. 【最长公共前缀】算法优化笔记

    题目:编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例 1:输入: ["flower","flow&quo ...

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

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

  7. 推荐算法炼丹笔记:科学调参在模型优化中的意义

    作者:九羽 ,公众号:炼丹笔记 基于Embedding的推荐算法模型一直是近几年研究的热门,在各大国际会议期刊都能看到来自工业界研究与实践的成果.MF(Matrix Factorization)作为传 ...

  8. leetcode 罗马数字与整数的转换算法

    介绍: 该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一 ...

  9. 【算法百题之四十二】罗马数字转整数

    [算法百题之四十二]罗马数字转整数    大家好,我是Lampard~~    很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!    今天的问题是:罗马数字转整数 作为[整 ...

最新文章

  1. python字符串endswith,Python字符串| 具有示例的endswith()方法
  2. oracle更新快捷方式的错误,oracle 11g数据库启动错误总结
  3. 剑指offer:链表中倒数第k个节点
  4. 如何控制订单发料后不能删除组件
  5. 程序员过关斩将--解决分布式session问题
  6. 帖子回复——无限级分类
  7. java新手的第一个小东西,或许小东西都算不上=。 =
  8. C++中main函数中参数argc和argv的使用实例
  9. MySQL实战系列3:视图、存储过程、函数、索引全解析
  10. centos下安装xcrysden出现的问题
  11. Web 前端面试题总结
  12. 【前端开源模板推荐】
  13. 学习Struts框架系列(一):模拟Struts工作流程
  14. 5分绩点转4分_4分绩点与百分制转换方法
  15. 创业公司遇到招募技术人才难的问题,怎么办?
  16. Android之UI学习篇二:TextVeiw显示表情和跑马灯效果
  17. pfamscan 的使用_使用pfam-scan进行Pfam注释
  18. LAN8720A不能自动获取IP地址的问题
  19. 基于Opencv快速实现人脸识别(完整版)
  20. 关于四种定位方式的介绍

热门文章

  1. 博士申请 | 香港浸会大学万人杰教授招收计算机视觉全奖博士生/研究助理
  2. 北京/上海/杭州 | 蚂蚁金服智能引擎技术事业部招聘知识图谱算法工程师
  3. 入坑推荐系统,拿这个开源项目练手
  4. 综述:基于GAN的图像翻译模型盘点
  5. 最新知识图谱论文清单,就算看不懂也会忍不住收藏
  6. 奖金+大赛入门,来参加我们的论文有奖复现!
  7. Github 最新 AI 开源项目了解一下?
  8. 蓝桥备赛第一周2021.1.11 递归 枚举 位运算
  9. image caption优秀链接
  10. springboot优雅停机