题目描述解题思路使用队列的思想来进行层次遍历数组队列存储当前节点的左右指针,然后将队头清除,知道队列中的所有元素都被清空。解题代码var levelOrder = function (root) { if (root === null) return []; const result = []; const pointer = [root]; while (pointer.length !== 0) { result.push(pointer
题目描述解题思路一(暴力法)暴力法就是定义一个滑动窗口,然后通过循环不断地去移动这个窗口
1:使用npm安装prop-types包npm install prop-types2:导入工具包import PropTypes from 'prop-types';3:对传入的props进行限制(这个是写在被传入的位置)
题目描述解题思路使用DFS的遍历思想,遍历二叉树。递归的结束条件是:当前节点为null或为q,或为p则返回。判断获得的左右子树返回的结果,如果右子树为空,返回左子树,左子树为空返回右子树,左右子树都不为空,返回当前节点node实现代码// 二叉搜索树的特点:左子树 < 根节点 < 右子树var lowestCommonAncestor = function (root, p, q) { if (root === null || root === p || root =
使用reverse方法注意:reverse方法会使得原数组发生变化
reduce方法可以用来求一个数组的累计和pre代表前面所有的加一起的累积值0代表的是默认的pre值index代表的是下标reduce方法将数组中的元素连接成一个长的字符串
安装nanoid工具包npm i nanoid导入模块import {nanoid} from ‘nanoid’;使用nanoid生成不重复的id
题目描述解题思路思路一:使用哈希表(空间复杂度不满足)将键表示为数组的元素,值表示为出现的次数// 方法1:使用Map数据结构var singleNumbers = function(nums) { const m = new Map(); for (let v of nums) { if (m.has(v)) { m.set(v,m.get(v) + 1) } else { m.set(v,1)
灵活使用toUpperCase和toLowerCase注意修改的是字面量还是变量function titleCase(str) { const result = str.split(' '); for (let i in result) { result[i] = result[i][0].toUpperCase() + result[i].slice(1,result[i].length).toLowerCase(); } result con
很多人以为这里的i是下标,其实不是,而是下标的字符串形式?
题目描述解题思路使用两个数组分别用来存储奇数和偶数使用for循环遍历输入数组的每一个元素当目标元素对2取余为0,说明该元素为偶数,偶数则加入偶数数组,反之则加入奇数数组最后使用ES6中的拓展运算符将两个数组合并为一个进行返回,即是最后的答案解题代码var exchange = function(nums) { const arr1 = []; const arr2 = []; for (let v of nums) { if (v % 2 ===
state在哪里,修改state的方法就应该在哪里
快捷键Ctrl+ Tab键上面的那个模板字符串用的实现快速打开VSCode终端命令行
reset.css:://github.com/jgthms/minireset.c
题目描述解题思路一(暴力法)当只有一级台阶的时候 F(1) = 1 只有一种跳法当有两级台阶的时候 要么 1 + 1
题目描述解题思路(数学规律)本题主要是从二维数组的左下角的元素出发,不断的进行移动比较,因为本题给出的二维数组存在一个特点就是,从左小角的元素出发,一列的元素中,上面的元素总是比下面的元素小,一行的元素中,右边的元素总是比左边的大,这个特点就是我们解题的关键。解题代码var findNumberIn2DArray = function(matrix, target) { // ! 本题核心:以左下角为起始点,如果比左下角的数字小,向上移动一位进行比较 // ! 如果比左下角的数
题目描述解题思路本题如果直接使用递归进行计算,思路上是简单的,但是一定会超时,因为递归的时间复杂度太高,所以本题采用循环计算法。所谓循环计算法,就是用两个临时变量,指向第i个元素的前两个元素,随着i的更新而不断更新。解题代码var fib = function(n) { if (n <= 1) return n; let temp1 = 1; let temp2 = 1; let res; for (let i = 0 ; i < n; i
题目描述解题思路(数学规律)本题的主流解法包括两种,主要是递归回溯与动态规划,鉴于动态规划不易理解,本文采用递归回溯的方法进行讲解,步骤如下:1. 判断p字符串是否为空,如果为空则继续判断字符串s是否为空我们首先要准确理解字符s和字符p的含义,字符s代表的是待匹配的字符串,而字符串p则代表的是我们的匹配模式如果匹配模式为空,我们要看待匹配的字符s是否为空,如果两者皆为空,说明空匹配空,结果返回true,如果p为空,但是s不为空,说明让空去匹配非空,肯定false,这是我们递归的出口。i
一、什么是事件循环机制?在介绍事件循环机制之前,我们要首先了解以下什么是事件循环机制,我们首先看下下面这段代码的执行顺序,正确的执行顺序应该是序号1>3>2为什么是上面的顺序呢?原因是JS引擎指向代码是从上往下执行的,所以首先会执行序号1这个语句,JS引擎会将这个语句放在调用栈当中,然后执行代码,将序号1打印在控制台当中,当这段代码执行完毕之后,便将这段代码从调用栈中移出去。然后开始执行后续的代码,此时setTimeout这段代码进入调用栈,这段代码,会调用Web API,2秒之后进
1. 引入store.js库项目地址npm i store2. 定义并导出存储到本地的模块(storageUtils.js)// ! 本模块主要是进行local数据存储import store from 'store'const USER_KEY = 'user_key';export default { // 保存用户 saveUser(user) { store.set(USER_KEY,user);// 登录成功的时候,读取用户数据并放在内存中
题目描述解题思路循环结束的位置就是10**位数 -1从1开始循环到指定位置即可。解题代码var printNumbers = function(n) { // 定义循环结束的位置 const deadline = 10 ** n - 1; // 定义最终返回的数组 const res = []; // 开始循环 for (let i = 1; i <= deadline; i++) { res.push(i) }
题目描述解题思路本题核心: 当n为奇数和偶数时两种情况的讨论,同时要注意n为0、负数是的情况。情况1: (2,4) = (2,2) * (2,2)情况2:(2,5) = (2,2) * (2,2) * 2具体详尽思路请看注释解题代码var myPow = function(x, n) { // !本题核心: 当n为奇数和偶数时两种情况的讨论 // 情况1: (2,4) = (2,2) * (2,2) // 情况2:(2,5) = (2,2) *
题目描述解题思路本题采用正则表达式的解法,就当作练习自己的正则表达式了使用trim去除字符串两侧的空格。小数的情况。整数的情况。为e或E的情况,然后后面跟着一个整数的情况综合上面四种情况,来综合判断是否符合表示数值的字符串。这道题题干真的很清晰。解题代码var isNumber = function(s) { // 去除字符串两侧的空格 s = s.trim(); // 判断是否有 + - 号,有则继续判断 const num = s.match
题目描述解题思路本题与《剪绳子I》这个题目本质是一样的,但是区别在于,本题加大了数字范围需要对答案进行取模1000000007,但是我们在调用Math.max函数的时候,里面不能有BigInt类型,所以我们必须自己实现Max函数,本题采用的是排序的方式求出最大值,但是排序的写法有讲究,具体看下面的解题代码解题代码var cuttingRope = function(n) { // 本题可以采用动态规划的思想 // 动态规划的结束条件是dp[2] = 1 代表的含义是长度为2的
引入React哲学React最棒的部分之一是引导我们思考如何构建一个应用,接下来本文将通过React构建一个可搜索的产品数据表格来深刻的领会React哲学。从设计稿开始假设我们已经拥有了以下几个东西一个能够返回JSON数据的API[ {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"}, {category: "Sporting Goods", price: "$9.99",
警告原因href="javascript:;"上面这段代码的存在。解决办法使用href="/#"代替
题目描述解题思路本次使用暴力解法:拿到链表对应的字符字符串数值,然后将数值反转之后转为BigInt类型,之所以转为BigInt类型的原因在于后期测试用例中有大数形式。将两个数值相加,然后转为字符数组,然后反转。定义一个数组,将字符数组的每一个元素变为相应节点后,添加进数组。遍历这个临时数组,依次改变指针。返回数组的头元素即可。手绘思路解题代码var addTwoNumbers = function(l1, l2) { function ListNode(val,ne
11. 输出是什么?function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastName;}const member = new Person("Lydia", "Hallie");Person.getFullName = function () { return `${this.firstName} ${this.lastName}`;}console.log(me
题目描述解题思路本题采用双指针的解题方法。一个指针指向数组1。一个指针指向数组2。依次比较两个指针指向的元素的大小,谁小谁加到排序好的数组中,直到一方遍历完,将没遍历完的全部加到排序好的数组中即可。最后判断结果数组的个数是奇数还是偶数,如果是奇数直接返回中位数元素,如果是偶数则返回中位数元素和中位数元素后边的一位元素,两者求和然后/2,返回。解题代码var findMedianSortedArrays = function(nums1, nums2) { // 首先我们要明确一
6. 输出是什么?let c = { greeting: 'Hey!' }let dd = cc.greeting = 'Hello'console.log(d.greeting)答:输出是 ‘Hello’,因为在JS中对象是一种引用类型,d和c指向的是同一片内存区域,所以对c进行修改,d指向的内容也发生了改变。7. 输出是什么?let a = 3let b = new Number(3)let c = 3console.log(a == b)console.log(a =
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号