算法题:

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  1. - 解题
  2. ```javascript
  3. var sortedListToBST = function(head) {
  4. if (head == null) return null;
  5. let slow = head
  6. let fast = head
  7. let pre ;
  8. while(fast && fast.next) {
  9. pre = slow
  10. slow = slow.next
  11. fast = fast.next.next
  12. }
  13. let root = new TreeNode(slow.val)
  14. if (pre != null ) {
  15. pre.next = null
  16. root.left= sortedListToBST(head)
  17. }
  18. root.right = sortedListToBST(slow.next);
  19. return root
  20. }

请实现你自己的 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 也不会被调用

  1. - 解题
  2. ```javascript
  3. class EventEmitter {
  4. constructor() {
  5. this.eventList = new Map()
  6. }
  7. subscribe(eventName, callback) {
  8. if (!this.eventList.has(eventName)) {
  9. this.eventList.set(eventName,new Set())
  10. }
  11. const eventList = this.eventList.get(eventName)
  12. const callbackObj = {callback}
  13. eventList.add(callbackObj)
  14. return {
  15. release:()=> {
  16. eventList.delete(callbackObj)
  17. if (eventList.size === 0) {
  18. delete this.eventList.eventName
  19. }
  20. }
  21. }
  22. }
  23. emit(eventName, ...args) {
  24. let callbacks = this.eventList.get(eventName)
  25. if (callbacks) {
  26. callbacks.forEach(item =>{
  27. item.callback.apply(null,args)
  28. })
  29. }
  30. }
  31. }
  • 遇到的问题
    • 一开始没想到用Map 和Set 存储数据
    • Set 添加值的时候,是直接添加的,并没有注意到相同的值添加不进去
    • 对于sub1.release()返回值的方法进行调用是懵逼的,一开始并不知道可以这样写
    • 有待加强