刷题笔记(第五天)
最佳答案 问答题库538位专家为你答疑解惑
1. 给定一个罗马数字,将其转换成整数。
罗马数字包含以下七种字符: 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。
输入: s = "III" 输出: 3
输入: s = "IV" 输出: 4
输入: s = "IX" 输出: 9
var romanToInt = function(s) {let m=new Map([['I',1],['V',5],['X',10],['L',50],['C',100],['D',500],['M',1000]]);let res=0;for(let i=0;i<s.length;i++) {let left=m.get(s[i]);let right=m.get(s[i+1]);res+=left<right?-left:left;// 题意就是:当左侧小于右侧 右侧-左侧;当左侧大于右侧 左侧+右侧}return res;
};
2. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。数组中同一个元素在答案里不能重复出现。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
var twoSum = function(nums, target) {if (nums.length > 0) {let o = nums[0];let t = nums[0];for (let i = 0; i < nums.length; i++) {for (let j = i + 1; j < nums.length; j++) {if (nums[i] + nums[j] === target) {o = i;t = j;}}}return [o, t]} else {return [-1, -1]}
}
3.给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
这个题官方解答用了“滑动窗口”,后面要再仔细看一下。
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
var lengthOfLongestSubstring = function (s) {if (s.length === 0 || s.length === 1) {return s.length;} else {let s1 = '';let a = [];for (let i = 0; i < s.length; i++) {if (s1.includes(s.charAt(i)) === true) {s1 += s.charAt(i)// console.log(a, a.length);// console.log(s1.length, i);i = i - s1.length + 1// console.log(i);s1 = '';// console.log(i);} else {s1 += s.charAt(i);}a.push(s1.length)}console.log(a);let m = a[0];for (let i = 0; i < a.length; i++) {if (m < a[i]) {m = a[i]}}return m;}
};
每一次要将存储最长子串的变量s1置空的时候,将该子串的长度存入数组a中、同时要注意将i退回(i-s1.length+1),最后找出数组a中最大元素,即最长子串的长度。
以下是其他人的解答,感觉更简单易懂:
var lengthOfLongestSubstring = function(str) {if (str.length <= 1) {return str.length}let left = 0let right = 1let max = 0let tempwhile(right<str.length){temp = str.slice(left, right)if (temp.indexOf(str.charAt(right)) > -1) {left++continue} else {right++}if (right - left > max) { max = right - left }}return max
};// 作者:Romantic Ardinghellix4s
// 链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/
// 来源:力扣(LeetCode)
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"刷题笔记(第五天)":http://eshow365.cn/6-37006-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!