算法题:
- 链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/
- 题目描述: ```javascript 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例: 输入: head = [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 解题```javascriptvar sortedListToBST = function(head) {if (head == null) return null;let slow = headlet fast = headlet pre ;while(fast && fast.next) {pre = slowslow = slow.nextfast = fast.next.next}let root = new TreeNode(slow.val)if (pre != null ) {pre.next = nullroot.left= sortedListToBST(head)}root.right = sortedListToBST(slow.next);return root}
遇到的问题
链接:https://bigfrontend.dev/zh/problem/create-an-Event-Emitter
- 题目描述 ```javascript Node.js中有Event Emitter,Facebook 也曾经有自己的实现 不过已经archive了。
请实现你自己的 Event Emitter
const emitter = new Emitter() 它需要支持事件订阅
const sub1 = emitter.subscribe(‘event1’, callback1) const sub2 = emitter.subscribe(‘event2’, callback2)
// 同一个callback可以重复订阅同一个事件 const sub3 = emitter.subscribe(‘event1’, callback1) emit(eventName, …args) 可以用来触发callback
emitter.emit(‘event1’, 1, 2); // callback1 会被调用两次 subscribe()返回一个含有release()的对象,可以用来取消订阅。
sub1.release() sub3.release() // 现在即使’event1’被触发, // callback1 也不会被调用
- 解题```javascriptclass EventEmitter {constructor() {this.eventList = new Map()}subscribe(eventName, callback) {if (!this.eventList.has(eventName)) {this.eventList.set(eventName,new Set())}const eventList = this.eventList.get(eventName)const callbackObj = {callback}eventList.add(callbackObj)return {release:()=> {eventList.delete(callbackObj)if (eventList.size === 0) {delete this.eventList.eventName}}}}emit(eventName, ...args) {let callbacks = this.eventList.get(eventName)if (callbacks) {callbacks.forEach(item =>{item.callback.apply(null,args)})}}}
- 遇到的问题
- 一开始没想到用Map 和Set 存储数据
- Set 添加值的时候,是直接添加的,并没有注意到相同的值添加不进去
- 对于sub1.release()返回值的方法进行调用是懵逼的,一开始并不知道可以这样写
- 有待加强
