算法

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

解答

  1. /**
  2. * @param {string} s
  3. * @return {number}
  4. */
  5. var romanToInt = function(s) {
  6. const romanNum = {
  7. 'I': 1,
  8. 'V': 5,
  9. 'X': 10,
  10. 'L': 50,
  11. 'C': 100,
  12. 'D': 500,
  13. 'M': 1000
  14. }
  15. let romanArry = s.split('')
  16. let total = 0
  17. for (var i = 0; i < romanArry.length; i++) {
  18. const ele = romanArry[i]
  19. if (i < romanArry.length - 1 && romanNum[ele] < romanNum[romanArry[i + 1]]) {
  20. total -= romanNum[ele]
  21. } else {
  22. total += romanNum[ele]
  23. }
  24. }
  25. return total
  26. };

分析:
首先建立一个罗马数字的hashMap,观察规律,当左边的罗马数字比右边的小时,就要减去左边的数字,所以使用循环的方式,从第一个数字开始和后一个数字做对比,如果比下一个小,就让总数减去当前的数字,如果比它大就直接加上当前的数字。注意临界值,当遍历到最后一个数字时,就没有下一个数字做比较,当前只能进行加,所以要在if判断的时候看看是否是最后一个数字。
**

Review

本周读了 responsive web design 这是一篇关于如何设计响应式网站的文章。
响应式网站可以使用 media query 判断屏幕的宽度大小,然后根据宽度不同的大小采用不同的布局

Tips

公众号和小程序互跳限制
类似这种奇奇怪怪的需求,要求的很多,所以遇到这种问题只有及时总结出来,供以后参考,可能还会有更新,要时常更新。

Share

本周想要分享的点是工作中关于创建项目的思考。

在开启新项目时,对前端来说项目模板的搭建很重要,项目模板决定了项目的整个风格,基本上第一个页面写完就确定了,剩下的只需要按照当前Demo的格式风格来写就可以了,所以项目模板的好坏决定了日后工作中的整个基调。

当然了每个公司都有自己的项目,如果图快,只需要将原来项目copy一份,在原来的基础上进行修改就好了,但技术日新月异难免有些过时或者有更好的解决办法。所以是copy,还是对其进行优化然后更新现有的项目,提升技术的基栈,这还是得看个人的追求。

虽然答案很明显,但真正选择的时候大家就会暴露自己的真实想法。在我看来,copy一份和十份没什么区别,对自己一点帮助都没有,升级优化与前沿技术靠拢虽然痛苦点,但当真正的解决问题,看到项目规范完整就会很有成就感,每天写一样的代码时间长了一点意思都没有,这样下去只是代码的搬运工,成为真正的码农。

作为一个工程师还是要有点追求的。