前言
一个小伙伴说希望成立一个刷题小组,本就着富强、民主、文明、和谐,倡导自由、平等、公正、法治,倡导爱国、敬业、诚信、友善,积极培育社会主义核心价值观,我答应他了。
因为也没有刷过题,比较菜。然后就看了下别人家的孩子怎么刷题的,这里附上链接。
朝花夕拾 - 2019 总结(附 283 道 LeetCode 题解)
题目描述:
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121是回文,而123不是。
示例
输入: s = "III"
输出: 3
输入: s = "IV"
输出: 4
输入: s = "IX"
输出: 9
输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15 s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M') 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。 IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。
菜鸡的解题思路
/**
* @param {string} s
* @return {number}
* 有个特殊例子99 不能写成 IC 要写成 XCIX (100-10 10-1 XC IX)
* 像是9 4 这种边界值 表达为 IX IV 这种减一表达只能一次 不能出现IIX 8 这种表示 正确的 8 表示 VIII
* IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XL IX,999 应该写作 CMXCIX 。
* 所有我们从左到右找,如果后一位小于前一位,那么就是减法 等于就是加法
* 感觉有点像是二分法1~10多了一个5 可以组成【1,5,10】,同样的符号不会出现4次,四次就变成中位减一。例如IV 就是数字4
* 题目是输入罗马数字 转为整数,且数据是1~3999 并且保证不会出现跨位
* 总结倒序遍历集合{'I', 'V', 'X', 'L', 'C', 'D', 'M'},那么整一个映射吧,然后我们从左到右找,如果后一位小于前一位的映射结果,那么就是减法 大于等于就是加法。貌似有这个规律
*
*/
var romanToInt = function (s) {
//我们建一个映射 这里我想用ES6 Map 数据结构,就是大家所悉知的set get .通过Array.form 就变成数组了 [[name,'shunjie'],[sex,'Male'],[sex1,'Female']]
let arr = [["I", 1], ["V", 5], ["X", 10], ["L", 50], ["C", 100], ["D", 500], ["M", 1000]];
let romanMap = new Map(arr);
//遍历s这个字符串
//这里顺道说说for of for in;大家不是说不会搞混么? for of 可以遍历可迭代iterators属性 能拿到对应key 的value值。与 break、continue和return 配合使用,也就是说 for of 循环可以随时退出循环。
// for in 很适合遍历对象 还会给你来个数字排序,字符串创建时序升序。
//这里我们发现字符串数组也是实现了Symbol.iterator 属性的,大家肯定说要用for of ,这就是区别啊,for of 有实现迭代器就可以用,好了我们这里用 for
let initNum = 0;
//复制第一个值
initNum = romanMap.get(s[s.length - 1])
for (let i = s.length - 1; i > 0; i--) {
if (romanMap.get(s[i]) <= romanMap.get(s[i - 1])) {
initNum += romanMap.get(s[i - 1])
} else {
initNum -= romanMap.get(s[i - 1])
}
}
//倒序遍历
return initNum
};
大佬们的解题
var romanToInt = function(s) {
const symbolValues = new Map();
symbolValues.set('I', 1);
symbolValues.set('V', 5);
symbolValues.set('X', 10);
symbolValues.set('L', 50);
symbolValues.set('C', 100);
symbolValues.set('D', 500);
symbolValues.set('M', 1000);
let ans = 0;
const n = s.length;
for (let i = 0; i < n; ++i) {
const value = symbolValues.get(s[i]);
if (i < n - 1 && value < symbolValues.get(s[i + 1])) {
ans -= value;
} else {
ans += value;
}
}
return ans;
};
今天就到这里了。