main
lsrong 2 years ago
parent 00317032d8
commit b8a6e6947e

File diff suppressed because it is too large Load Diff

@ -0,0 +1,345 @@
每周有营养的大厂算法面试题
第001节 2021年11月第4周流行算法题目解析
给定一棵多叉树的头节点head每个节点只有黑白两色
所有黑节点都保留,所有从头节点到黑节点路径上的点都保留
返回处理后树的头节点
我们正在玩一个猜数游戏,游戏规则如下:
我从 1 到 n 之间选择一个数字。
你来猜我选了哪个数字。
如果你猜到正确的数字,就会 赢得游戏 。
如果你猜错了,那么我会告诉你,我选的数字比你的 更大或者更小 ,并且你需要继续猜数。
每当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。
如果你花光了钱,就会 输掉游戏 。
给你一个特定的数字 n ,返回能够 确保你获胜 的最小现金数,不管我选择那个数字 。
Leetcode链接 : https://leetcode.com/problems/guess-number-higher-or-lower-ii/
来自真实面试,同学给我的问题
限制0 <= start <= end0 <= target <= 64
[start,end]范围上的数字有多少数字二进制中1的个数等于target
第002节 2021年12月第1周流行算法题目解析
int n, int[][] roads, int x, int y
n表示城市数量城市编号0~n-1
roads[i][j] == distance表示城市i到城市j距离为distance(无向图)
求城市x到城市y的最短距离
一开始屏幕上什么也没有,粘贴板里什么也没有,
你只能在键盘上做如下4种操作中的1种
输入在屏幕上已经显示内容的后面加一个A
全选:把屏幕上已经显示的全部内容选中
复制:被选中的内容复制进粘贴板
粘贴:在屏幕上已经显示内容的后面添加粘贴板里的内容
给定一个正数n表示你能操作的步数
返回n步内你能让最多多少个A显示在屏幕上
Leetcode链接 : https://leetcode.com/problems/4-keys-keyboard/
给定一棵树的头节点head原本是一棵正常的树
现在,在树上多加了一条冗余的边
请找到这条冗余的边并返回
Leetcode链接 : https://leetcode.com/problems/redundant-connection-ii/
第003节 2021年12月第2周流行算法题目解析
给你一个整数 n ,表示有 n 个专家从 0 到 n - 1 编号。
另外给一个下标从 0 开始的二维整数数组 meetings
其中 meetings[i] = [xi, yi, timei] 表示专家 xi 和专家 yi 在时间 timei 要开一场会。
一个专家可以同时参加 多场会议 。最后,给你一个整数 firstPerson 。
专家 0 有一个 秘密 最初他在时间 0 将这个秘密分享给了专家 firstPerson 。
这个秘密会在每次有知晓这个秘密的专家参加会议时进行传播。更正式的表达是,每次会议,
如果专家 xi 在时间 timei 时知晓这个秘密,那么他将会与专家 yi 分享这个秘密,反之亦然。
秘密共享是 瞬时发生 的。也就是说,在同一时间,一个专家不光可以接收到秘密,还能在其他会议上与其他专家分享。
在所有会议都结束之后,返回所有知晓这个秘密的专家列表。你可以按 任何顺序 返回答案。
Leetcode链接 : https://leetcode.com/problems/find-all-people-with-secret/
来自美团
所有黑洞的中心点记录在holes数组里
比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9)
并且所有黑洞的中心点都在左下角(0,0),右上角(x,y)的区域里
飞船一旦开始进入黑洞,就会被吸进黑洞里
返回如果统一所有黑洞的半径,最大半径是多少,
依然能保证飞船从(0,0)能到达(x,y)
arr数组长度为n, magic数组长度为m
比如 arr = { 3, 1, 4, 5, 7 }如果完全不改变arr中的值
那么收益就是累加和 = 3 + 1 + 4 + 5 + 7 = 20
magics[i] = {a,b,c} 表示arr[a~b]中的任何一个值都能改成c
并且每一种操作,都可以执行任意次,其中 0 <= a <= b < n
那么经过若干次的魔法操作你当然可能得到arr的更大的累加和
返回arr尽可能大的累加和
n <= 10^7 m <= 10^6 arr中的值和c的范围 <= 10^12
已知一棵二叉树上所有的值都不一样,
给定这棵二叉树的头节点head
给定一个整型数组arrarr里放着不同的值每个值一定在树上
返回数组里所有值的最低公共祖先
Leetcode链接 : https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree-iv/
给定一棵多叉树的头节点head
每个节点的颜色只会是0、1、2、3中的一种
任何两个节点之间的都有路径
如果节点a和节点b的路径上包含全部的颜色这条路径算达标路径
(a -> ... -> b)和(b -> ... -> a)算两条路径
求多叉树上达标的路径一共有多少?
点的数量 <= 10^5
第004节 2021年12月第3周流行算法题目解析
来自TME2022校园招聘后台开发/运营开发/业务运维/应用开发笔试
给定一棵二叉树的头节点head和一个正数k。从最底层开始每一层右移k位然后往上走过每一层进行树的调整
返回调整之后树的头节点
具体详情请参加如下的测试页面
测试链接 : https://www.nowcoder.com/test/33701596/summary
本题目为该试卷第1题
来自TME2022校园招聘后台开发/运营开发/业务运维/应用开发笔试
给定一个只由'0'和'1'组成的字符串,代表一个无符号整数
你只能在连续的一个子串上翻转子串也就是子串上0变11变0。返回最大的结果
具体详情请参加如下的测试页面
测试链接 : https://www.nowcoder.com/test/33701596/summary
本题目为该试卷第2题
来自TME2022校园招聘后台开发/运营开发/业务运维/应用开发笔试
给定两个参数n和k返回m
含义k进制的情况下把1~m每一位的状态列出来其中1状态出现的数量要>=n
返回最小的、能做到这一点的m值
具体详情请参加如下的测试页面
测试链接 : https://www.nowcoder.com/test/33701596/summary
本题目为该试卷第3题
你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中:
0 表示障碍,无法触碰
1 表示地面可以行走
比1大的数 表示有树的单元格也可以行走数值表示树的高度
每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。
你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1即变为地面
你将从 (0, 0) 点开始工作,返回你砍完所有树需要走的最小步数。 如果你无法砍完所有的树,返回 -1 。
可以保证的是,没有两棵树的高度是相同的,并且你至少需要砍倒一棵树
Leetcode链接 : https://leetcode.com/problems/cut-off-trees-for-golf-event/
来自CMU入学申请考试
给定一个长度为 N 的字符串 S由字符'a'和'b'组成,空隙由 '?' 表示
你的任务是用a字符或b字符替换每个间隙
替换完成后想让连续出现同一种字符的最长子串尽可能短
例如S = "aa??bbb"
如果将"??"替换为"aa" ,即"aaaabbb"则由相等字符组成的最长子串长度为4
如果将"??"替换为"ba" ,即"aababbb"则由相等字符组成的最长子串长度为3
那么方案二是更好的结果返回3
S的长度 <= 10^6
第005节 2021年12月第4周流行算法题目解析
来自美团
给定一个无向图
从任何一个点x出发比如有一条路径: x -> a -> b -> c -> y
这条路径上有5个点并且5个点都不一样的话我们说(x,a,b,c,y)是一条合法路径
这条合法路径的代表就是x,a,b,c,y所组成的集合我们叫做代表集合
如果从b到y还有一条路径叫(b,a,c,x,y),那么(x,a,b,c,y)和(b,a,c,x,y)是同一个代表集合
返回这个无向图中所有合法路径的代表集合数量
题目给定点的数量n <= 15边的数量m <= 60
所有的点编号都是从0~n-1的
来自北京北明数科信息技术有限公司
class AreaResource {
String area; // area表示的是地区全路径,最多可能有6级比如 中国,四川,成都  或者  中国,浙江,杭州
String spliter; // 比如:逗号 -> ,
long count; // 表示地区的门店数量
}
现在需要把  List<AreaResource> 进行转换,需要做到同级的地域能合并
比如area为中国,四川,成都 有10个门店area为中国,浙江,杭州有25个门店area为中国,浙江,义乌有22个门店
最终生成的JSON字符串为 {"中国":{"四川":{"成都":10]},"浙江":{"义乌":22,"杭州":25}}}
请实现下面的方法 public String mergeCount(List<AreaResource> areas) 
来自hulu
有一个以原点为圆心半径为1的圆
在这个圆的圆周上,有一些点
因为所有的点都在圆周上,所以每个点可以有很简练的表达
比如用0来表示一个圆周上的点这个点就在(1,0)位置
比如用6000来表示一个点这个点是(1,0)点沿着圆周逆时针转60.00度之后所在的位置
比如用18034来表示一个点这个点是(1,0)点沿着圆周逆时针转180.34度之后所在的位置
这样一来,所有的点都可以用[0, 36000)范围上的数字来表示
那么任意三个点都可以组成一个三角形,返回能组成钝角三角形的数量
整个二维平面算是一张地图,给定[x,y]表示你站在x行y列
你可以选择面朝的任何方向
给定一个正数值angle表示你视野的角度为
这个角度内你可以看无穷远,这个角度外你看不到任何东西
给定一批点的二维坐标,
返回你在朝向最好的情况下,最多能看到几个点
有m个同样的苹果认为苹果之间无差别
有n个同样的盘子认为盘子之间也无差别
还有比如5个苹果如果放进3个盘子
那么1、3、1和1、1、3和3、1、1的放置方法也认为是一种方法
如上的设定下,返回有多少种放置方法
第006节 2021年12月第5周流行算法题目解析
有一组 n 个人作为实验对象,从 0 到 n - 1 编号,其中每个人都有不同数目的钱,
以及不同程度的安静值quietness
为了方便起见我们将编号为 x 的人简称为 "person x "。
给你一个数组 richer ,其中 richer[i] = [ai, bi] 表示 person ai 比 person bi 更有钱
另给你一个整数数组 quiet 其中 quiet[i] 是 person i 的安静值
richer 中所给出的数据 逻辑自洽
也就是说,在 person x 比 person y 更有钱的同时,不会出现 person y 比 person x 更有钱的情况
现在,返回一个整数数组 answer 作为答案其中 answer[x] = y 的前提是
在所有拥有的钱肯定不少于 person x 的人中person y 是最安静的人也就是安静值 quiet[y] 最小的人)。
leetcode链接 : https://leetcode.com/problems/loud-and-rich/
来自hulu
有n个人m个任务任务之间有依赖记录在int[][] depends里
比如: depends[i] = [a, b]表示a任务依赖b任务的完成
其中 0 <= a < m0 <= b < m
1个人1天可以完成1个任务每个人都会选当前能做任务里标号最小的任务
一个任务所依赖的任务都完成了,该任务才能开始做
返回n个人做完m个任务需要几天
来自hulu
你只有1*1、1*2、1*3、1*4四种规格的砖块
你想铺满n行m列的区域规则如下
1不管那种规格的砖都只能横着摆
比如1*3这种规格的砖3长度是水平方向1长度是竖直方向
2会有很多方法铺满整个区域整块区域哪怕有一点点不一样就算不同的方法
3区域内部(不算区域整体的4条边界),不能有任何砖块的边界线(从上一直贯穿到下)
返回符合三条规则下铺满n行m列的区域有多少种不同的摆放方法
第007节 2022年1月第1周流行算法题目解析
来自阿里
给定一个只由'a'和'b'组成的字符串str
str中"ab"和"ba"子串都可以消除,
消除之后剩下字符会重新靠在一起,继续出现可以消除的子串...
你的任务是决定一种消除的顺序最后让str消除到尽可能的短
返回尽可能的短的剩余字符串
在一张 无向 图上节点编号0~N-1。老鼠开始在1节点猫在2节点0号节点是洞老鼠想进洞
老鼠第先出发,猫后出发,轮流行动。
在每个玩家的行动中,他们 必须 沿着图中与所在当前位置连通的一条边移动
此外猫无法移动到洞中(节点 0
然后,游戏在出现以下三种情形之一时结束:
如果猫和老鼠出现在同一个节点,猫获胜。
如果老鼠到达洞中,老鼠获胜。
如果某一位置重复出现(即,玩家的位置和移动顺序都与上一次行动相同),游戏平局。
给你一张图 graph ,并假设两位玩家都都以最佳状态参与游戏,返回谁获胜
leetcode链接 : https://leetcode.com/problems/cat-and-mouse/
给你两个长度分别 n 和 m 的整数数组 nums 和 multipliers ,其中 n >= m
数组下标 从 1 开始 计数。
初始时,你的分数为 0 。
你需要执行恰好 m 步操作。在第 i 步操作(从 1 开始 计数)中,需要:
选择数组 nums 开头处或者末尾处 的整数 x 。
你获得 multipliers[i] * x 分,并累加到你的分数中。
将 x 从数组 nums 中移除。
在执行 m 步操作后,返回 最大 分数。
leetcode链接 : https://leetcode.com/problems/maximum-score-from-performing-multiplication-operations/
来自学员问题
给定一个二维数组,其中全是非负数
每一步都可以往上、下、左、右四个方向运动
返回从左下角走到右下角的最短距离
第008节 2022年1月第2周流行算法题目解析
给定一个非常大的List<String> list
每一个字符串类似 : "hello,world,have,hello,world"
这一个字符串中有2个hello2个world1个have
请设计一种多线程处理方案统计list中每一个字符串切分出来的单词数量并且汇总
最终返回一个HashMap<String, Integer>表示每个字符串在list中一共出现几次
多线程设计 + 算法
本题没有代码实现,会在课上讲述思路
给定一个正数数组arr其中每个值代表砖块长度
所有砖块等高等宽,只有长度有区别
每一层可以用1块或者2块砖来摆
要求每一层的长度一样
要求必须使用所有的砖块
请问最多摆几层
来自兴业数金
给定一个字符串形式的数,比如"3421"或者"-8731"
如果这个数不在-32768~32767范围上那么返回"NODATA"
如果这个数在-32768~32767范围上那么这个数就没有超过16个二进制位所能表达的范围
返回这个数的2进制形式的字符串和16进制形式的字符串用逗号分割
给你一个下标从 0 开始包含 n 个正整数的数组 arr 和一个正整数 k 
如果对于每个满足 k <= i <= n-1 的下标 i 都有 arr[i-k] <= arr[i] 那么我们称 arr 是 K 递增 的。
比方说arr = [4, 1, 5, 2, 6, 2] 对于 k = 2 是 K 递增的,因为:
arr[0] <= arr[2] (4 <= 5)
arr[1] <= arr[3] (1 <= 2)
arr[2] <= arr[4] (5 <= 6)
arr[3] <= arr[5] (2 <= 2)
但是相同的数组 arr 对于 k = 1 不是 K 递增的因为 arr[0] > arr[1]
对于 k = 3 也不是 K 递增的因为 arr[0] > arr[3] )。
每一次 操作 你可以选择一个下标 i 并将 arr[i] 改成任意 正整数。
请你返回对于给定的 k 使数组变成 K 递增的 最少操作次数 。
leetcode链接 : https://leetcode.com/problems/minimum-operations-to-make-the-array-k-increasing/
来自美团
小美有一个长度为n的数组
为了使得这个数组的和尽量大,她向会魔法的小团进行求助
小团可以选择数组中至多两个不相交的子数组,
并将区间里的数全都变为原来的10倍
小团想知道他的魔法最多可以帮助小美将数组的和变大到多少?
给定一个非负数组arr学生依次坐在0~N-1位置每个值表示学生的安静值
如果在i位置安置插班生那么i位置的安静值变成0同时任何同学都会被影响到而减少安静值
同学安静值减少的量: N - 这个同学到插班生的距离
但是减到0以下的话当做0处理
返回一个和arr等长的ans数组ans[i]表示如果把插班生安排在i位置所有学生的安静值的和
比如 : arr = {3,4,2,1,5},应该返回{4,3,2,3,4}
比如 : arr = {10,1,10,10,10},应该返回{24,27,20,20,22}
arr长度 <= 10^5
arr中值 <= 2 * 10^5
注意:本题在直播课上讲错了,已经发了重新录制的视频,请一定要看更正后的视频
第009节 2022年1月第3周流行算法题目解析
A*算法
过程和Dijskra高度相处
有到终点的预估函数
只要预估值<=客观上最优距离,就是对的
预估函数是一种吸引力:
1合适的吸引力可以提升算法的速度
2吸引力“过强”会出现错误
在一个10^6 * 10^6的网格中
source = [sx, sy]是出发位置target = [tx, ty]是目标位置
数组blocked是封锁的方格列表被禁止的方格数量不超过200
blocked[i] = [xi, yi] 表示(xi, yi)的方格是禁止通行的
每次移动都可以走上、下、左、右四个方向
但是来到的位置不能在封锁列表blocked上
同时不允许走出网格
如果从source能到达target返回 true。否则返回false。
来自字节跳动
给定一个数组arr其中的值有可能正、负、0
给定一个正数k
返回累加和>=k的所有子数组中最短的子数组长度
第010节 2022年1月第4周流行算法题目解析

File diff suppressed because it is too large Load Diff

@ -0,0 +1,225 @@
算法和数据结构新手班
01 位运算、算法是什么、介绍位运算和简单排序
内容:
讲解二进制、位运算
介绍什么是算法
讲解冒泡、选择、插入排序
题目:
实现打印一个整数的二进制
给定一个参数N返回1!+2!+3!+4!+…+N!的结果
实现冒泡排序
实现选择排序
实现插入排序
02 数据结构的大分类、介绍前缀和与对数器
内容:
什么是数据结构、组成各种数据结构最基本的元件
前缀和数组
随机函数
对数器的使用
题目:
实现前缀和数组
如何用1~5的随机函数加工出1~7的随机函数
如何用a~b的随机函数加工出c~d的随机函数
展示对数器的使用
如何把不等概率随机函数变成等概率随机函数
03 介绍二分法,介绍时间复杂度、动态数组、哈希表和有序表
内容:
二分法
使用二分法解决不同的题目
时间复杂度
动态数组
按值传递、按引用传递
哈希表
有序表
题目:
有序数组中找到num
有序数组中找到>=num最左的位置
有序数组中找到<=num最右的位置
局部最小值问题
哈希表使用的code讲解
有序表使用的code讲解
04 链表相关的简单面试题
内容:
单双链表的定义
栈、队列
双端队列
题目:
反转单链表
反转双链表
用单链表实现队列
用单链表实现栈
用双链表实现双端队列
K个节点的组内逆序调整问题
给定一个单链表的头节点head和一个正数k
实现k个节点的小组内部逆序如果最后一组不够k个就不调整
例子:
调整前1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8k = 3
调整后3 -> 2 -> 1 -> 6 -> 5 -> 4 -> 7 -> 8
两个链表相加问题
给定两个链表的头节点head1和head2
认为从左到右是某个数字从低位到高位,返回相加之后的链表
例子 4 -> 3 -> 6 2 -> 5 -> 3
返回 6 -> 8 -> 9
解释 634 + 352 = 986
两个有序链表的合并
给定两个有序链表的头节点head1和head2
返回合并之后的大链表,要求依然有序
例子 1 -> 3 -> 3 -> 5 -> 7 2 -> 2 -> 3 -> 3-> 7
返回 1 -> 2 -> 2 -> 3 -> 3 -> 3 -> 3 -> 5 -> 7
05 位图、位运算实现加减乘除
内容:
位图
位运算使用的进一步学习:实现加减乘除
题目:
现场写位图的code、讲解
位运算的加减乘除
06 比较器、优先级队列、二叉树
内容:
比较器
优先级队列
二叉树的基本遍历
二叉树的递归套路
题目:
补充了一个链表的题目
合并多个有序链表
Leetcode原题https://leetcode.com/problems/merge-k-sorted-lists
判断两颗树是否结构相同
Leetcode原题https://leetcode.com/problems/same-tree
判断一棵树是否是镜面树
Leetcode原题https://leetcode.com/problems/symmetric-tree
返回一棵树的最大深度
Leetcode原题https://leetcode.com/problems/maximum-depth-of-binary-tree
用先序数组和中序数组重建一棵树
Leetcode原题https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
用code展示比较器的使用
二叉树先序、中序、后序遍历的代码实现、介绍递归序
07 继续二叉树的很多题目
内容:
进一步讲解二叉树题目,来熟悉二叉树
题目:
二叉树按层遍历并收集节点
Leetcode原题https://leetcode.com/problems/binary-tree-level-order-traversal-ii
判断是否是平衡搜索二叉树
Leetcode原题https://leetcode.com/problems/balanced-binary-tree
在二叉树上能否组成路径和
Leetcode原题https://leetcode.com/problems/path-sum
在二叉树上收集所有达标的路径和
Leetcode原题https://leetcode.com/problems/path-sum-ii
判断二叉树是否是搜索二叉树
08 介绍归并排序和快速排序
内容:
讲解一个位运算的题目
归并排序
快速排序
题目:
不要用任何比较判断,返回两个数中较大的数
归并排序的递归实现和非递归实现
快速排序的递归实现和非递归实现
Loading…
Cancel
Save