分糖果
分糖果
Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的 最多 种类数。
输入:candyType = [1,1,2,2,3,3]
输出:3
解释:Alice 只能吃 6 / 2 = 3 枚糖,由于只有 3 种糖,她可以每种吃一枚。-
1234let distributeCandies = function(candyType) { const set = new Set(candyType); return Math.min(set.size, candyType.length / 2);};
分发饼干
分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
输入: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。所以你应该输出 1。
12345678910111213141516// 排序 + 双指针 + 贪心let findContentChildren = function(g, s) { g.sort((a, b) => a - b); s.sort((a, b) => a - b); const m = g.length, n = s.length; ...
第一个错误的版本
第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
1234567891011121314151617181920212223/** * @param {function} isBadVersion() * @return {function} * ...
岛屿的周长
岛屿的周长
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
思路:
一块土地原则上会带来 4 个周长,但岛上的土地存在接壤,每一条接壤,会减掉 2 个边长。
所以,总周长 = 4 _ 土地个数 - 2 _ 接壤边的条数。
遍历矩阵,遍历到土地,就 land++,如果它的右/下边也是土地,则 border++,遍历结束后代入公式。
12345678910111213141516171819const islandPerimeter = (grid) => ...
2 的幂
2 的幂
一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
输入:n = 1
输出:true
解释:2^0 = 1
输入:n = 16
输出:true
解释:2^4 = 16
1234567let isPowerOfTwo = function(n) { // 一个数 n 是 2 的幂,当且仅当 n 是正整数,并且 n 的二进制表示中仅包含 1 个 1。 // n 需要是正数且 n 与 n-1 二进制 相比 差别在于在唯一的 1 之后按位取反, 4 = 0100, 3 = 0011, & 运算后得 0 return n > 0 && (n & (n - 1)) === 0;};
快乐数
快乐数「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
输入:n = 19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
1234567891011121314151617181920212223// 可以想象一个对象的 val = n, next = n各个位数的平方和,依次类推,组成了一个链表// 如果链表中产生了无限循环,那一定是链表中有环了// 判断链表是否有环,使用快慢指针const isHappy = (n) => { let slow = n, fast = squareSum(n) while (slow != fast) { slow = squareSum(slow) ...
react 父组件更改 props 子组件无法刷新
问题描述有两个变量,一个 _count_,不是父组件 state 中的值,一个 number 是父组件 state 中的值
点击更改‘ 更改 state 的值’ 按钮,父子组件同步刷新,而点击 更改 count 的值 按钮,子组件不会刷新
原因父组件更改 count 的值,虽然父组件 count 值改变,但是不会触发组件更新,因为只有通过 setState 告知 react 页面更新,state 的意义就是监听数据变化,因而直接修改数据值不触发页面更新,数据虽然变化但页面不更新。
在 vue 中,采用的就是直接赋值的方式来更新 data 数据,并且 Vue 也能够使用最新的 data 数据渲染页面。这是为什么呢? 在 vue2 中采用的是 Object.defineProperty() 方式监听数据的 get 和 set 方法,做到数据变化的监听 在 vue3 中采用的是 ES6 的 proxy 方式监听数据的变化
要想让子组件更新 dom,必须让子组件执行 render()方法,而父组件执行 render()方法后,子组件也会执行 render()方法,这就是为何父组件调用了 s ...
相同的树
相同的树
给两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
1234567let isSameTree = function(p, q) { // 如果两个节点都是空节点 则肯定相同 如果两个节点只有一个节点为空 if (p == null || q == null) return p == q; // 两个节点的值是否相同,只有相同才去递归比较左右子树 return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right)};
矩形重叠
矩形重叠
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。如果相交的面积为 正 ,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形 rec1 和 rec2 。如果它们重叠,返回 true;否则,返回 false 。
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
123456var isRectangleOverlap = function(rec1, rec2) { const [x1, y1, x2, y2] = rec1; const [x3, y3, x4, y4] = rec2; return !(x1 >= x4 || x3 >= x2 || y3 >= y2 || y1 >= y4);};
TS-函数重载
函数重载 (函数参数间的组合约定)原生js中并没有真正的函数重载,重名函数会被覆盖,但ts中可以有。
浅谈JavaScript函数重载
ts支持函数重载,一般用于针对传入不同的参数或参数数量以及返回值之间的类型约定。
12345678910111213141516// 第一套约定(attr是'display'时,value必须是 'block' | 'nonde')function showOrHide(ele: HTMLElement, attr: 'display', value: 'block' | 'nonde');// 第二套约定(attr是'opacity'时,value必须是number)function showOrHide(ele: HTMLElement, attr: 'opacity', value: number);// 函数的实现function showOrHide(ele: HTMLElemen ...