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