【罗马数字转整数】算法优化笔记
给定一个罗马数字,将其转换成整数。
罗马数字包含以下七种字符: 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.【关系的归纳】
详细代码
哈希表版
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;}
}
【罗马数字转整数】算法优化笔记相关推荐
- 【整数反转】算法优化笔记
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1:输入: 123输出: 321示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21 假设我们 ...
- 【回文数】算法优化笔记
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数(不将整数转为字符串来解决). 示例 1:输入: 121输出: true示例 2:输入: -121输出: fals ...
- 【两数之和】算法优化笔记
题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同 ...
- 【斐波那契数列】算法优化笔记
题目:斐波那契数列为:1,1,2,3,5,8-,求第n项? 初步分析 设an为斐波那契数列. a1=a2=1;(n<=2) an=a(n-1) + a(n-2);(n>=2) 本章总结 [ ...
- 【最长公共前缀】算法优化笔记
题目:编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例 1:输入: ["flower","flow&quo ...
- 【每日一算法】罗马数字转整数
微信改版,加星标不迷路! 每日一算法-罗马数字转整数 作者:阿广 阅读目录 1 题目 2 解析 1 题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1 V 5 ...
- 推荐算法炼丹笔记:科学调参在模型优化中的意义
作者:九羽 ,公众号:炼丹笔记 基于Embedding的推荐算法模型一直是近几年研究的热门,在各大国际会议期刊都能看到来自工业界研究与实践的成果.MF(Matrix Factorization)作为传 ...
- leetcode 罗马数字与整数的转换算法
介绍: 该算法是将罗马数字转换为整数,思路如下:比如IXX,使用临时变量temp保存上一个已经遍历的罗马数字,比如:遍历时是从后往前遍历的:1> 刚开始时,temp = 0; 遍历当前遍历到第一 ...
- 【算法百题之四十二】罗马数字转整数
[算法百题之四十二]罗马数字转整数 大家好,我是Lampard~~ 很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙! 今天的问题是:罗马数字转整数 作为[整 ...
最新文章
- python字符串endswith,Python字符串| 具有示例的endswith()方法
- oracle更新快捷方式的错误,oracle 11g数据库启动错误总结
- 剑指offer:链表中倒数第k个节点
- 如何控制订单发料后不能删除组件
- 程序员过关斩将--解决分布式session问题
- 帖子回复——无限级分类
- java新手的第一个小东西,或许小东西都算不上=。 =
- C++中main函数中参数argc和argv的使用实例
- MySQL实战系列3:视图、存储过程、函数、索引全解析
- centos下安装xcrysden出现的问题
- Web 前端面试题总结
- 【前端开源模板推荐】
- 学习Struts框架系列(一):模拟Struts工作流程
- 5分绩点转4分_4分绩点与百分制转换方法
- 创业公司遇到招募技术人才难的问题,怎么办?
- Android之UI学习篇二:TextVeiw显示表情和跑马灯效果
- pfamscan 的使用_使用pfam-scan进行Pfam注释
- LAN8720A不能自动获取IP地址的问题
- 基于Opencv快速实现人脸识别(完整版)
- 关于四种定位方式的介绍