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

98 阅读1分钟

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

题号:102
 
//栈,迭代广度优先搜索
var levelOrder = function (root) {
    if (root == null) {
        return []
    }
    let queue = [root]
    let result = []
    while (queue.length != 0) {
        let tmp = []
        let length = queue.length
        while (length != 0) {
            let node = queue.shift()
            tmp.push(node.val)
            if (node.left) {
                queue.push(node.left)
            }
            if (node.right) {
                queue.push(node.right)
            }
            length--
        }
        result.push(tmp)
    }
    return result
};
题号:156
//此题最大的难度是理解题意,我钻进怎么打印"#"其实此题没有打印这个一说
//根据题意:右子节点存在的情况下左子节点必然存在,右子节点不存在的情况,左子节点不一定存在
var upsideDownBinaryTree = function (root) {
    if (root == null) {
        return root
    }
    //我发现的规律是,顺指针调换顺序
    //left变为root root变为right right变为left
    let helper = (node) => {
        if (node == null) {
            return null
        }
        let left = helper(node.left)
        let right = helper(node.right)
        if (left == null) {
            return new TreeNode(node.val)
        } else {

            let lastRight = left
            while (lastRight.right) {
                lastRight = lastRight.right
            }
            if (right) {
                //根据题意right节点不一定存在
                //要判断
                lastRight.left = new TreeNode(right.val) 
            }
            lastRight.right = new TreeNode(node.val)
            //返回left的含义:left作为左子树的根
            return left
        }
    }
    return helper(root) 
};
题号:14
/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function (strs) {
    let minStr = ""
    strs.forEach((str) => {
        if (minStr == "") {
            minStr = str
        } else {
            if (str.length < minStr.length) {
                minStr = str
            }
        }
    });
    //找到最小字符串
    let result = minStr.slice()
    //从最小字符串开始一一匹配各个字符串看是否满足题意
    //不满足就缩小result继续匹配
    while (true) {
        let isOk = true
        for (let i = 0; i < strs.length; i++) {
            let ele = strs[i]
            if (!ele.startsWith(result)) {
                isOk = false
                break
            }
        }
        if (!isOk) {
            result = result.slice(0,result.length - 1)
        } else {
            break
        }
    }
    return result
};
题号:340
/**
 * @param {string} s
 * @param {number} k
 * @return {number}
 */
var lengthOfLongestSubstringKDistinct = function (s, k) {

    let left = 0, right = 0, max = 0
    let map = new Map()
    while (right <= s.length - 1) {
        
        let letter = s[right]
        if (map.has(letter)) {
            let count = map.get(letter)
            count++
            map.set(letter,count)
        } else {
            map.set(letter,1)
        }
        //map中记录中的字母如果大于k
        //那么就移动left缩小窗口使得窗口符合题意
        while (map.size > k) {
            let letter = s[left]
            let count = map.get(letter)
            count--
            if (count == 0) {
                map.delete(letter)
            } else {
                map.set(letter,count)
            }
            left++
        }
        //找到符合题意的的就比较找出max
        max = Math.max(max, right - left + 1)
        right++
    }
    return max
};