题目来源: LeetCode 75 30 天 JavaScript 挑战
2694. 事件发射器
思路
模拟法,使用一个 Map 对象保存事件回调数组
代码
js
class EventEmitter {
#events = new Map()
/**
* @param {string} eventName
* @param {Function} callback
* @return {Object}
*/
subscribe(eventName, callback) {
if (!this.#events.has(eventName)) {
this.#events.set(eventName, [])
}
this.#events.get(eventName).push(callback)
return {
unsubscribe: () => {
const cbs = this.#events.get(eventName).filter(cb => cb !== callback)
this.#events.set(eventName, cbs)
}
};
}
/**
* @param {string} eventName
* @param {Array} args
* @return {Array}
*/
emit(eventName, args = []) {
return (this.#events.get(eventName) ?? []).map(cb => cb(...args))
}
}
1143. 最长公共子序列
思路
二维数组动态规划,当 text1[i - 1]
等于 text2[j - 1]
时 dp[i][j] = dp[i - 1][j - 1] + 1
,否则 dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
最后返回 dp 数组最大值
代码
js
/**
* @param {string} text1
* @param {string} text2
* @return {number}
*/
var longestCommonSubsequence = function(text1, text2) {
const dp = Array.from(Array(text1.length + 1), () => Array(text2.length + 1).fill(0))
for (let i = 1; i <= text1.length; i++) {
for (let j = 1; j <= text2.length; j++) {
if (text1[i - 1] === text2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
}
}
}
return dp[text1.length][text2.length]
};
714. 买卖股票的最佳时机含手续费
思路
动态规划,每天有两种情况,买股票或者卖股票,买股票要加上手续费,
代码
js
/**
* @param {number[]} prices
* @param {number} fee
* @return {number}
*/
var maxProfit = function(prices, fee) {
if (!prices.length) {
return 0
}
// 定义种情况
let dp_0_0 = 0
let dp_0_1 = -prices[0]
for (let i = 1; i < prices.length; i++) {
// 卖股票
dp_0_0 = Math.max(dp_0_0, dp_0_1 + prices[i] - fee)
// 买股票
dp_0_1 = Math.max(dp_0_1, dp_0_0 - prices[i])
}
return dp_0_0
};
72. 编辑距离
思路
动态规划,dp[i][j]
表示 dp[i - 1][j - 1]
最少的操作数。每次遍历判断如果 word1[i - 1]
等于word2[j - 1]
那么 dp[i][j] = dp[i - 1][j - 1]
, 否则取 dp[i - 1][j] + 1
, dp[i][j - 1] + 1
, dp[i - 1][j - 1] + 1
这三种操作的最小值。
代码
js
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
var minDistance = function(word1, word2) {
const dp = Array.from(Array(word1.length + 1), () => Array(word2.length + 1).fill(0))
for(let i = 1; i <= word1.length; i++) {
dp[i][0] = i
}
for(let i = 1; i <= word2.length; i++) {
dp[0][i] = i
}
for(let i = 1; i <= word1.length; i++) {
for(let j = 1; j <= word2.length; j++) {
if(word1[i - 1] === word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1]
} else {
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1)
}
}
}
return dp[word1.length][word2.length]
};
本文完,感谢阅读。