JavaScript中apply, bind, call 的区别

apply、bind 和 call 是 JavaScript 中的三个方法,都是用来控制函数的 this 指向的。它们有相似之处,但在传递参数和调用方式上有一些区别。我们可以逐一看看它们的定义和使用场景。 1. call 方法 语法:func.call(thisArg, arg1, arg2, …) 示例 在这里,call 方法将 this 设置为 person 对象,并将 “Hello” 和 “!” 作为参数传递给 greet 函数。 2. apply 方法 语法:func.apply(thisArg, [argsArray]) 示例 在这里,apply 的作用与 call 类似,但传递参数的方式不同。apply 使用一个数组来传递参数,而 call 使用的是一组独立的参数。 3. bind 方法 语法:func.bind(thisArg, arg1, arg2, …) 示例 在这里,bind 创建了一个新函数 boundGreet,这个函数的 this 永远绑定为 person,并预设了第一个参数 […]

Read More

Unlocking the Lock: Solving the “Open the Lock” Problem with BFS

Today, we’re diving into a classic interview problem, Open the Lock. This problem requires us to use Breadth-First Search (BFS) to find the shortest path by simulating a lock mechanism with four wheels. Let’s walk through the problem step-by-step, analyze the solution, and cover key details in the code. Problem Overview The problem describes a […]

Read More

简单易懂的TypeScript哈希表教程

用TypeScript写个哈希表——说白了就是“找东西利器” 哈希表这个东西呢,跟生活中找钥匙差不多。想象一下,你每次出门都乱丢钥匙,回家要用半小时才能找到它。如果有个哈希表,那你一秒就能知道钥匙放哪了。所以今天我们来用TypeScript写个哈希表,别担心,跟朋友聊天一样简单。 什么是哈希表? 哈希表就像给你的钥匙分配了个专属抽屉,你把钥匙往哈希表里一丢,它自己找个抽屉放好,等你要用的时候,你直接问它:“我的钥匙在哪呢?” 它马上告诉你在哪个抽屉里,秒找。是不是很方便?那咱现在就来动手写一个。 代码部分——慢慢来,不急 我们来一步步写哈希表,代码都标注好,解释清楚,放心不会扯得太远。 class HashTable<T> { // 创建一个桶数组,桶就是个小抽屉,里面装着key-value对 private buckets: Array<Array<[string, T]>>; // 哈希表的大小,也就是有多少个抽屉 private size: number; constructor(size: number) { this.size = size; // 创建一个指定大小的桶数组,初始每个位置是个空数组 this.buckets = new Array(size).fill(null).map(() => []); // 为啥要fill(null)?TypeScript不允许你直接在空数组上map,得先填充一波。 } // 哈希函数,负责把key变成数字,这样才能找到对应的桶 private hash(key: string): number { let hash = 0; for (let i = 0; i […]

Read More

Implementing a Priority Queue in TypeScript: A Step-by-Step Guide

Priority queues are essential data structures in computer science, especially when dealing with tasks that require ordering based on priority. In this blog post, we’ll explore how to implement a priority queue in TypeScript, which can help solve problems like LeetCode’s 215. Kth Largest Element in an Array. Introduction A priority queue is a special […]

Read More

使用TypeScript实现优先队列 (Priority Queue)

前言 大家好!今天我想和大家分享如何使用TypeScript实现一个优先队列(Priority Queue),并利用它来解决LeetCode第215题——数组中的第K个最大元素。在算法面试中,优先队列是一个非常常用的数据结构,理解并能熟练实现它对我们解决一系列问题都有帮助。 问题描述 LeetCode第215题:数组中的第K个最大元素 给定一个未排序的整数数组 nums,找到其中第 k 个最大的元素。 示例: 提示: 解题思路 要找到第 k 个最大的元素,我们可以采用多种方法: 在这篇文章中,我们重点介绍使用最小堆实现的优先队列,因为它在实际应用中非常高效,且实现相对简单。 什么是优先队列? 优先队列是一种特殊的队列,元素按照优先级进行出入队操作。常用的实现方式是堆,根据堆的性质,可以快速地获取当前的最值(最大值或最小值)。 在我们的问题中,我们需要维护一个大小为 k 的最小堆,堆顶元素就是当前第 k 个最大的元素。 TypeScript中实现最小堆 堆的基本操作 实现代码 代码解释 利用最小堆解决第K个最大元素问题 实现思路 实现代码 代码解释 测试代码 时间复杂度分析 空间复杂度分析 总结 通过使用最小堆实现的优先队列,我们可以高效地找到数组中的第 k 个最大元素。这种方法在处理大规模数据时非常实用,因为我们不需要对整个数组进行排序,只需维护一个大小为 k 的堆即可。 优点 缺点 后记 希望这篇文章能帮助大家理解如何在TypeScript中实现优先队列,并应用于实际问题。如果有任何疑问或改进建议,欢迎在评论区与我交流! 参考资料 感谢阅读!如果觉得有帮助,请点赞支持。

Read More

430. Flatten a Multilevel Doubly Linked List

You are given a doubly linked list, which contains nodes that have a next pointer, a previous pointer, and an additional child pointer. This child pointer may or may not point to a separate doubly linked list, also containing these special nodes. These child lists may have one or more children of their own, and […]

Read More

TypeScript Data Structure: Implementing a Doubly Linked List

用Typescript实现一个双向链表 Design your implementation of the linked list. You can choose to use a singly or doubly linked list. A node in a singly linked list should have two attributes: val and next. val is the value of the current node, and next is a pointer/reference to the next node. If you want to use […]

Read More

Typescript Data Structures: Linked List

In the vast expanse of data structures available to developers, the LinkedList holds a unique place. Known for its efficiency in insertion and deletion operations, it’s a staple in algorithm design and application development. This post explores how to implement a LinkedList in TypeScript, bringing together the efficiency of this data structure with the strong […]

Read More