日常刷题0x15之未出新手村

95 阅读2分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

题号:243
//map统计分析比较
var shortestDistance = function (wordsDict, word1, word2) {
    let map = new Map()
    wordsDict.forEach((word,idx,arr) => {
        if (map.has(word)) {
            let words = map.get(word)
            words.push(idx)
            map.set(word,words)
        } else {
            let words = [idx]
            map.set(word,words)
        }
    });
    let min = wordsDict.length
    let arr1 = map.get(word1)
    let arr2 = map.get(word2)
    for (let i = 0; i < arr1.length; i++) {
        let w1 = arr1[i]
        for (let j = 0; j < arr2.length; j++) {
            let w2 = arr2[j]
            min = Math.min(min,Math.abs(w1 - w2))
        }
    }
    return min
};

//单指针记录上一个word1或者word2比较下一个word1或者word2,然后移动该指针
var shortestDistance = function (wordsDict, word1, word2) {
    let preWordIdx = -1,min = wordsDict.length
    for (let i = 0; i < wordsDict.length; i++) {
        let curWord = wordsDict[i]
        if (curWord == word1 || curWord == word2) {
            if (preWordIdx == -1) {
                preWordIdx = i
            } else {
                if (curWord == wordsDict[preWordIdx]) {
                    preWordIdx = i
                } else {
                    min = Math.min(min, i - preWordIdx)
                    preWordIdx = i
                }
            }
        }
    }
    return min
};
题号:剑指offer48
//动态规划
var lengthOfLongestSubstring = function (s) {
    //dptable标识以i结尾的最大子串长度
    let dptable = [],max = 0
    for (let i = 0; i < s.length; i++) {
        let char = s[i]
        if (i == 0) {
            dptable[i] = 1
        } else {
            //每次到第i个字母的时候就要从i-1处向前遍历找第一个和i相同的字母,
            //a bcdef a a和a之间加+1就是以i结尾串最大长度
            dptable[i] = dptable[i - 1] + 1
            let count = dptable[i - 1],flag = i - 1
            while (count != 0) {
                if (s[i] === s[flag]) {
                    dptable[i] = i - flag
                    break
                }
                count--
                flag--
            }
        }
        max = Math.max(max,dptable[i])
    }
    return max
};
/**
 * @param {string} s
 * @return {number}
 */
//滑动窗口
var lengthOfLongestSubstring = function (s) {
    let left = 0, right = 0
    let map = new Map()
    let maxLen = 0
    while (right < s.length) {
        let rWord = s[right]
        if (map.has(rWord)) {
            let count = map.get(rWord)
            count++
            map.set(rWord,count)
        } else {
            map.set(rWord,1)
        }
        if (map.size < right - left + 1) {
            //有重复字母
            //开始收缩left,使满足题意
            while (true) {
                let lWord = s[left]
                let count = map.get(lWord)
                left++
                count--
                if (count === 0) {
                    map.delete(lWord)
                } else {
                    //找到那个重复的字符了
                    //退出
                    map.set(lWord, count)
                    break
                }
                
            }
        }
        maxLen = Math.max(maxLen, map.size)
        right++
    }
    return maxLen
};
题号:103
//广度优先遍历
var zigzagLevelOrder = function (root) {
    if (root == null) {
        return []
    }
    let isLeft = true, stack = [root],result = []
    while (stack.length != 0) {
        let len = stack.length
        let arr = []
        while (len != 0) {
            let node = stack.shift()
            if (isLeft) {
                arr.push(node.val)
            } else {
                arr.unshift(node.val)
            }
            if (node.left) {
                stack.push(node.left)
            }
            if (node.right) {
                stack.push(node.right)
            }
            len --
        }
        result.push(arr)
        isLeft = !isLeft
    }
    return result
};