算法
罗马数字包含以下七种字符: 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 链接
解答
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
const romanNum = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
}
let romanArry = s.split('')
let total = 0
for (var i = 0; i < romanArry.length; i++) {
const ele = romanArry[i]
if (i < romanArry.length - 1 && romanNum[ele] < romanNum[romanArry[i + 1]]) {
total -= romanNum[ele]
} else {
total += romanNum[ele]
}
}
return total
};
分析:
首先建立一个罗马数字的hashMap,观察规律,当左边的罗马数字比右边的小时,就要减去左边的数字,所以使用循环的方式,从第一个数字开始和后一个数字做对比,如果比下一个小,就让总数减去当前的数字,如果比它大就直接加上当前的数字。注意临界值,当遍历到最后一个数字时,就没有下一个数字做比较,当前只能进行加,所以要在if判断的时候看看是否是最后一个数字。
**
Review
本周读了 responsive web design 这是一篇关于如何设计响应式网站的文章。
响应式网站可以使用 media query
判断屏幕的宽度大小,然后根据宽度不同的大小采用不同的布局
Tips
公众号和小程序互跳限制
类似这种奇奇怪怪的需求,要求的很多,所以遇到这种问题只有及时总结出来,供以后参考,可能还会有更新,要时常更新。
Share
本周想要分享的点是工作中关于创建项目的思考。
在开启新项目时,对前端来说项目模板的搭建很重要,项目模板决定了项目的整个风格,基本上第一个页面写完就确定了,剩下的只需要按照当前Demo的格式风格来写就可以了,所以项目模板的好坏决定了日后工作中的整个基调。
当然了每个公司都有自己的项目,如果图快,只需要将原来项目copy一份,在原来的基础上进行修改就好了,但技术日新月异难免有些过时或者有更好的解决办法。所以是copy,还是对其进行优化然后更新现有的项目,提升技术的基栈,这还是得看个人的追求。
虽然答案很明显,但真正选择的时候大家就会暴露自己的真实想法。在我看来,copy一份和十份没什么区别,对自己一点帮助都没有,升级优化与前沿技术靠拢虽然痛苦点,但当真正的解决问题,看到项目规范完整就会很有成就感,每天写一样的代码时间长了一点意思都没有,这样下去只是代码的搬运工,成为真正的码农。
作为一个工程师还是要有点追求的。