ARTS 第 11 周

每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章


Contents:


Algorithm

罗马数字到整型数字 题目:13. Roman to Integer

难度:Easy

题意:

罗马数字包含以下七种字符: IVXLCD 和 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 的范围内。

示例一:

Input: "III"
Output: 3

示例二:

Input: "IV"
Output: 4

示例三:

Input: "IX"
Output: 9

示例四:

Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.

示例五:

Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

解法:

说明,本题解法参考了 B 站 up 主「Michelle 小梦想家」的题解过程

此题理解题意并找到几个最重要的关键点,即可快速写出算法:

  1. 最多两个字母成一对
  2. 当前的字母是否比前一个读到的字母要大?如果大,那么这两个字母就是一对,否则不是一对
  3. 判断如果是一对之后,那么需要直接计算这一对的数值,即「当前值」-「前一位的值」,但是之前由于是每一位都直接加在 result 上,所以这里需要把「前一位的值」再减掉,故这里计算一对的值的时候,需要减两次「前一位的值」,即「当前值」- 2 *「前一位的值」
  4. 如果不是一对,那么直接加在 result 上即可

代码:

class Solution(object):
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """

        numeral_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        result = 0

        for i in range(len(s)):
            result += numeral_map[s[i]] - 2 * numeral_map[s[i-1]] if (i > 0 and numeral_map[s[i]] > numeral_map[s[i-1]]) else numeral_map[s[i]]

        return result

时间复杂度 O(n),空间复杂度 O(1)。


Review

Things you’re probably not using in Python 3 – but should

Python 3 是 Python 2 的全新升级版,有重大的改进。本文介绍 Python 3 到底增加了哪些功能。

简单罗列如下:

所有的代码都可以在作者的 GitHub 上找到。


Tips

将 Jupyter Notebook 转换为其他格式

本部分参考优达学城的 Jupyter 教程

Notebook 是 JSON 文件,所以可以很轻松地把它转换为其他格式以方便使用。

Jupyter 附带了一个名为 nbconvert 的实用程序,可将 notebook 转换为 HTML、Markdown、幻灯片等格式。

例如,要将 notebook 转换为 HTML 文件,请在终端中使用

jupyter nbconvert --to html notebook.ipynb

要将 notebook 与不使用 notebook 的其他人共享,转换为 HTML 很有用。而要在博客和其他接受 Markdown 格式化的文本编辑器中显示 notebook,Markdown 很合适。

另外,通过 notebook 创建幻灯片也是非常受欢迎的功能之一,你可以打开这个关于 Pandas 的示例

在 notebook 中创建幻灯片的过程像平常一样,但需要指定作为幻灯片的单元格和单元格的幻灯片类型。在菜单栏中,点击“View”(视图)> “Cell Toolbar”(单元格工具栏)> “Slideshow”(幻灯片),以便在每个单元格上弹出幻灯片单元格菜单。

打开单元格的幻灯片工具栏

这会在每个单元格上显示一个下拉菜单,让你选择单元格在幻灯片中的显示方式。

选择幻灯片类型

Slides(幻灯片)是你从左向右移动的完整幻灯片。按向上或向下的箭头时,Sub-slides(子幻灯片)会出现在幻灯片中。Fragments(片段)最初是隐藏的,在你按下按钮时会出现。选择 Skip(忽略)会忽略幻灯片中的单元格,而选择 Notes(备注)会将为演讲者保留备注。

要通过 notebook 文件创建幻灯片,需要使用 nbconvert

jupyter nbconvert notebook.ipynb --to slides

这只是将 notebook 转换为幻灯片必需的文件,你需要向其提供 HTTP 服务器才能真正看到演示文稿。 要转换它并立即看到它,请使用

jupyter nbconvert notebook.ipynb --to slides --post serve

这会在浏览器中打开幻灯片,让你可以演示它。


Share

分享几个我获取有价值信息的渠道

公众号:

RSS 订阅 & 网站:

邮件订阅: