背景

本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式,即选择了五个知识点(数组、链表、字符串、树、贪心算法),每个知识点选择了 三个简单、两个中等、一个困难 等级的题目,共计三十道题,利用三十天的时间完成这组刻意练习。

本次任务的知识点:字符串

字符串或串(string) 是由数字、字母、下划线组成的一串字符。一般记为 s = “a1a2...an”(n >= 0)。它是编程语言中表示文本的数据类型。

通常以串的整体作为操作对象,如:在串中查找某个子串在该串中首次出现的位置、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。串通常以顺序的方式进行存储与实现。


题目

  • 题号:13
  • 难度:简单
  • https://leetcode-cn.com/problems/roman-to-integer/

罗马数字包含以下七种字符: I, V, X, L,C,DM

字符          数值
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.

实现

第一种:直接法

根据“罗马数字中小的数字在大的数字的右边”以及六种特殊情况的规则直接去写代码。

  • 执行结果:通过
  • 执行用时:96 ms, 在所有 C# 提交中击败了 95.88% 的用户
  • 内存消耗:25.7 MB, 在所有 C# 提交中击败了 5.27% 的用户
public class Solution
{public int RomanToInt(string s){int result = 0;int count = s.Length;int i = 0;while (i < count){char c = s[i];int move = 0;switch (c){case 'I':result += PreI(i, s, ref move);break;case 'V':result += 5;move = 1;break;case 'X':result += PreX(i, s, ref move);break;case 'L':result += 50;move = 1;break;case 'C':result += PreC(i, s, ref move);break;case 'D':result += 500;move = 1;break;case 'M':result += 1000;move = 1;break;}i += move;}return result;}private int PreI(int index, string s, ref int move){//I  1//IV 4//IX 9//II 2int result = 0;int count = s.Length;if (index + 1 < count){char c = s[index + 1];switch (c){case 'V':result = 4;move = 2;break;case 'X':result = 9;move = 2;break;case 'I':result = 2;move = 2;break;}}else{result = 1;move = 1;}return result;}private int PreX(int index, string s, ref int move){//X 10//XL 40//XC 90int result = 0;int count = s.Length;if (index + 1 < count){char c = s[index + 1];switch (c){case 'L':result = 40;move = 2;break;case 'C':result = 90;move = 2;break;default:result = 10;move = 1;break;}}else{result = 10;move = 1;}return result;}private int PreC(int index, string s, ref int move){//C 100//CD 400//CM 900int result = 0;int count = s.Length;if (index + 1 < count){char c = s[index + 1];switch (c){case 'D':result = 400;move = 2;break;case 'M':result = 900;move = 2;break;default:result = 100;move = 1;break;}}else{result = 100;move = 1;}return result;}
}

第二种:利用字典的方法

把罗马字符的所有组合作为keyvalue存到字典当中,每次取一个字符,判断这个字符之后是否还有字符。如果有,则判断这两个字符是否在字典中,如果存在则取值。否则,按照一个字符去取值即可。

  • 执行结果:通过
  • 执行用时:120 ms, 在所有 C# 提交中击败了 42.16% 的用户
  • 内存消耗:25.8 MB, 在所有 C# 提交中击败了 5.27% 的用户
public class Solution
{public int RomanToInt(string s){Dictionary<string, int> dic = new Dictionary<string, int>();dic.Add("I", 1);dic.Add("II", 2);dic.Add("IV", 4);dic.Add("IX", 9);dic.Add("X", 10);dic.Add("XL", 40);dic.Add("XC", 90);dic.Add("C", 100);dic.Add("CD", 400);dic.Add("CM", 900);dic.Add("V", 5);dic.Add("L", 50);dic.Add("D", 500);dic.Add("M", 1000);int result = 0;int count = s.Length;int i = 0;while (i < count){char c = s[i];if (i + 1 < count && dic.ContainsKey(s.Substring(i, 2))){result += dic[s.Substring(i, 2)];i += 2;}else{result += dic[c.ToString()];i += 1;}}return result;}
}

Python 语言

  • 执行结果:通过
  • 执行用时:72 ms, 在所有 Python3 提交中击败了 24.93% 的用户
  • 内存消耗:13.5 MB, 在所有 Python3 提交中击败了 5.05% 的用户
class Solution:def romanToInt(self, s: str) -> int:dic = {"I": 1, "II": 2, "IV": 4, "IX": 9, "X": 10, "XL": 40, "XC": 90,"C": 100, "CD": 400, "CM": 900, "V": 5,"L": 50, "D": 500, "M": 1000}result = 0count = len(s)i = 0while i < count:c = s[i]if i + 1 < count and s[i:i + 2] in dic:result += dic[s[i:i + 2]]i += 2else:result += dic[c]i += 1return result

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

刻意练习:LeetCode实战 -- Task13. 罗马数字转整数相关推荐

  1. 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 ...

  2. java输出罗马数字,【Java】【刷穿 LeetCode】13. 罗马数字转整数(简单)

    首页 专栏 java 文章详情 0 [刷穿 LeetCode]13. 罗马数字转整数(简单) 宫水三叶发布于 今天 14:14 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 ...

  3. LeetCode实战:字符串转换整数 (atoi)

    题目英文 Implement atoi which converts a string to an integer. The function first discards as many white ...

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

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

  5. leetcode系列--13.罗马数字转整数

    leetcode系列–第13题.罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M.字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 ...

  6. leetcode学习记录-罗马数字转整数

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

  7. 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 ...

  8. Leetcode 简单四 罗马数字转整数

    罗马数字转整数: PHP 76ms: 核心思想为哈希表操作.PHP的具体表现为关联数组.把基本数据和6大特殊数据类型何其对应的数据设为关联数组,判断是否存在并累加即可.时间复杂度O(n),空间复杂度为 ...

  9. 【Leetcode | easy】罗马数字转整数

    题目 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做II,即为两个并列的 1. ...

最新文章

  1. Python:UTF-8编码转换成GBK编码
  2. Engineering:王军和张发明组发表人体肠道菌群的原位重建及昼夜节律的研究
  3. javascript 判断字符串中是否包含某个字符串
  4. react技术栈实践(1)
  5. 树莓派 安装中文字体、中文输入法fcitx和googlepinyin输入法
  6. 2021MIT博士pluskid年终总结
  7. kali的burpsuite笔记
  8. 响应信息有json和html,获取HTML响应而不是Json响应
  9. 计算机软件系统两大类,详解计算机软件系统包括哪两大类
  10. 年薪5w和50w的职场人思考力有什么区别
  11. 计算机核心论文如何审稿,2021年,审稿快、好中的核心期刊有哪些?
  12. lae界面开发工具入门之介绍八--消息转发器组件篇
  13. Tomcat 3、4、5、6、7、8、9 各版本下载地址
  14. 最小函数值(minval)
  15. 灰度图像--形态学处理:腐蚀、膨胀、开操作、闭操作、顶帽、底帽等
  16. Python学习之re.compile与findall
  17. oracle 11g新的后台进程
  18. ECharts之3D立体柱状图一
  19. 008 -菲波那切数列
  20. python编写关不掉的流氓表白软件

热门文章

  1. hung-yi lee_p18_图神经网络(cont.)
  2. 几何图形在logo设计中的有哪些情感意义?
  3. linux系统中find怎么用,linux系统中‘find’的详细用法
  4. flutter离线源码安装包最新版本下载地址
  5. Unity脚本生成插件:Script Create Dialog
  6. C语言竟成TIOBE年度编程语言候选!苹果iPhone 7卖得最好!
  7. C# 对应 Oracle 存储过程 的 SYS_REFCURSOR 应该 传入什么类型的参数?
  8. vue router 入门笔记
  9. ffmpeg 基本用法大全
  10. centos 6.4 SVN服务器多个项目的权限分组管理