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