刷题笔记(第五天)

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

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 = 0
      let right = 1
      let max = 0
      let temp
      while(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)

你可能感兴趣的:(笔记)