前端常面题总结(算法)

129 阅读2分钟

简单

1. 给定一个字符串 str ,请你找出其中不含有重复字符的最长子串的长度。

输入: str = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。   请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列, 不是子串。

var lengthOfLongestSubstring = function(str) {
    if(str.length <= 1){return str.length}
    let left = 0
    let right = 1
    let max = 0
    let temp
    while(right < str.length){
        temp = str.slice(left, right)
        if (temp.indexOf(str.charAt(right)) < 0) { // 不存在
            right ++
        } else {
            left ++
            continue 
        }
        max = Math.max(max, right - left)
    }
    return max
};

2. 给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

输入: s = "babad"

输出: "bab"

解释: "aba" 同样是符合题意的答案。

var longestPalindrome = function(s) {
    if(s.length < 2) return s
    let res = ''
    for(let i = 0; i < s.length; i++){
        helper(i, i)
        helper(i, i + 1)
    }
    function helper(m, n){
        while(m >= 0 && n < s.length && s[m] == s[n]){
            m--
            n++
        }
        if(n - m - 1 > res.length){
            res = s.slice(m + 1, n)
        }
    }
    return res
};

3. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。

输入: nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]

输出: 6

解释: 连续子数组 [4, -1, 2, 1] 的和最大,为 6 。

var maxSubArray = function(nums){
    let currentSum = nums[0]
    let maxSum = nums[0]
    for(let i = 1; i < nums.length; i++){
        currentSum = Math.max(currentSum + nums[i], nums[i])
        maxSum = Math.max(maxSum, currentSum)
    }
    return maxSum
}

4. 和为k的子数组

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数

子数组是数组中元素的连续非空序列。

输入: nums = [1, 2, 3], k = 3

输出: 2

var subarraySum = function(nums, k) {
    let sum = 0, count = 0
    let map = new Map([[0,1]])
    for(let num of nums){
        sum += num
        count += map.get(sum - k) ?? 0
        map.set(sum, (map.get(sum) ?? 0) + 1)
    }
    return count
}

5.