📌秋招八股--算法-全部知识
- 有一百亿个数字,怎么从里面选出来只出现了一次的数字
- 1TB找最大最小的数
- 海量信息存到数据库中的数据库设计方案
- 数据脱敏
- 二维码登录原理
- 场景题:app扫码浏览器的二维码登录怎么做的。以前没思考过,临场讲了下思路。然后问我服务端怎么主动将登录成功的信息推送给浏览器的?
- `美团`
- 布隆过滤器
- 数据结构的一些,栈溢出场景,位图等等。
- 名单降序排序
- 手撕冒泡排序
- 选择排序和冒泡排序的区别
- 堆和栈有什么区别(jvm)
- 知道哪些数据结构以及他们的特点
- 链表增删快,那如何提高其查询效率,有没有什么想法?
- LRU算法了解吗?你会如何实现它?这个算法可以应用在哪些场景下?
- 跳表了解吗?
- 大顶堆、小顶堆了解吗?
- 1)数字在排序数组中出现的次数
- 2)链表问题
- 1、单机里面有多个文件,每个文件包含若干个整数,找出这些文件中的值最大的k个数:
- 给定一个数组,里面的元素先是升序,再降序,比如 [1, 3, 5, 4, 2],找出最大的元素的下标:
- 倒转单链表(在原链表上倒转)
- 数字1-N 分布在长度为N+1的数组里面,一个元素重复1次,请求重复的元素?
- 问题:给定一个字符串,将后m个字符移到整个字符的前面。例 str = "abcd12" m=2,输出 “12abcd”
- 求数组交集:排序去重/双指针/map记录
- 求树的深度:递归/层序遍历/深度遍历
- 题:lc75:颜色分类
- 题:lc15:三数之和
- 题:搜索旋转后的排序数组
- 算法题leetcode- 23.合并K个升序链表(更改了一下参数,总体来说还好)
- 算法:给出[[1, 2], [3, 5], [8, 8], [15, 16], [32, 38]],求间隔
- 队列的实现,需要注意的地方
- 快速排序的实现、时间复杂度分析
- 算法:蛇形打印二叉树
- 讲讲平衡搜索树;
- 什么是平衡二叉树;
- 排序算法和对应的时空复杂度;
- 排序算法的稳定性是指什么意思
- 算法题:有一个映射表{1->A,2->B,……,26->Z},给你一个字符串,求出其能映射出多少个字符串,如123可以映射ABC,AW,等。
- 算法题:写一个String类型转换成对应的double的方法。
- 数组和链表的区别;算法题(不难)
- 数组链表区别;
- 两道算法题:快速写反转链表,要求在原链表上操作;求最长递增子序列,1长度2序列3长度最长数字最小的序列
- 编程题:用rand5实现rand3,rand7,要求等概率
- 说一下virtual table
- 一个类的大小怎么计算
- 编程题:二维矩阵旋转90度,要求不额外使用空间
- 二叉树后序遍历
- 1.货币兑换
- 2.地址简化
- 堆了解多少
- 算法:建堆和堆排
- 实现字典树
- 两个有序链表的合并,楼主写了递归,要求再写一个循环的。
- 容器、迭代器和算法的关系
- STL的sort函数是怎么实现的?
- 快速排序的最坏时间复杂度
- 如何改进快速排序避免陷入最坏时间复杂度的情况?
- 算法题1: LC15 三数之和
- 三数之和即将写完,< 第二次牛客网断连 >
- 面试官要求再做一题,算法题2:LC146 LRU
- 1. sql 很简单的题,写一写或者讲一讲,但是楼主很久没写了,稍微讲了讲&写了个伪代码。。。
- 2. leetcode32. 最长有效括号,
- 3. 上个题的若干强化
- 4. 反问:问他们是不是运维,做的事情是啥,框架是自己写还是用开源的。
- 5. 一个循环数组长度为n,请问最长能存储多少个数据?
- 6. 堆排序的过程(大致说一下),时间复杂度(已经懵了,说n^2,当然是nlogn)
- 手撕代码:给你一个数组和一个target,从数组中寻找三个数 a,b,c 使得 abs(a+b+c - target) 最小;
- 1、删除链表中的重复元素;
- 2、链表中小于等于target的值排在大于target的值前面。
- 1. 有序二维数组找target,找到返回坐标,找不到返回[-1, -1];
- 2. 树的根节点到叶子节点的所有路径和。
- 建堆(heap)的复杂度:
- 给定m * n矩阵matrix,可以从任意位置开始,向上、向下、向左、向右移动,但要求下一个位置上的元素要大于当前元素,找出矩阵中最长的递增路径的长度。
- sql题 :给定一个表 T(id, name, age, sex, city),写出一下查询语句:男性平均年龄最高的城市。
- 概率题:一种流行病患病概率是1%,有一种检测试纸,检测的准确率是99%,我现在试纸检测阳性了,请问我患病的概率有多大? (概率论有点忘了)
- 用一个[0,4)的随机数生成器rand4(),模拟一个[0.6)的随机数rand6() - 常见题,直接口述
- 32个石块,重量不等,用天平来进行衡量,找出最重的石块,最少需要几次? - 考官提示了一下,用归并的方法,应该是31次
- 1)数组中其他数出现两次有一个数出现一次找出这个数
- 2)数组中其他数出现两次,有一个数出现一次找出这两个数
- 3)链表 A->B->C->D->E 变成B->A->D->C->E
- 4)单调栈问题 数组中找出右边第一个比这个数大的数
- 1、给定数组,每个元素代表一个木头的长度,木头可以任意截断,从这堆木头中截出至少k个相同长度为m的木块,已知k,求max(m)。
- 2、 数据结构:时间复杂度O(1)的gemin()最小栈
- 3、 [8,1, 9, 10, 3, 5] 每次获取一个值,不能获取相邻的,求最大值,
- 智力测试 64匹马 八个赛道 求定位出前四名要进行几次比赛(当然是不可以计时了呀)
- 有一列房子,给出每个房子所需的涂料数量,要求尽可能多的使用白色涂料,求可能使用的最大涂料数量
- 给定一个矩阵,每个格子都有一个数值,从左上角出发,只能向右和向下走,求走到右下角时经过的所有格子的数值和的最大值
- 有几类硬币,每类都有无限多个,给定一个总值,求有几种表示方式
- 带精度的sqrt
- 链表重排列 12345变成15243
- 完全二叉树与搜索二叉树的概念
- o 通过给定的tree,判断是不是搜索二叉树和完全二叉树
- 给定一个随意的正整数数组,求最长的连续数字长度
- 给定一个数组和一个数s,找到最短的子数组加起来的和超过s
- 算法:给出两个升序数组A、B和长度m、n,求第k个大的数
- 算法:给出数组A,长度为n,数组中元素的值位于[0, n - 1]之间,求是否有重复元素
- 算法:lc.560改编。
- 用静态内部类写了个TreeNode,在面试的平台上会报错,面试官也没看出来是为什么。最后问面试官如何评价我的表现,面试官反问我自己觉得怎么样)
- 算法题:由前序遍历中序遍历重建子树,然后再前序遍历输出;
- 随机数求根(二分法)
- 有N个筐,每一个筐有一定数量苹果,把苹果从一个筐移到另一个筐的花费为距离大小,求需要让每个筐中的苹果数量相等,的最小花费;
- 问我一个贪心的思路,面试官让证明,不会。
Java后端各科最全八股自用整理,获取方式见
:
有一百亿个数字,怎么从里面选出来只出现了一次的数字
- Hash分桶法,将100亿个整数映射到不同的区间,在每个区间中分别找只出现一次的整数。
- Bitmap扩展:用2个bit表示状态,0表示未出现,1出现过1次,2出现过2次或以上。
1TB找最大最小的数
- 海量数据中找最大最小的数是一个常见的问题,通常需要使用分治的思想,将数据分成多个小块,分别处理,最后合并结果。
- 将数据分成大小为chunk_size的块,对每个块分别计算最小值和最大值,最后在所有最小值和最大值中找到最小值和最大值。
海量信息存到数据库中的数据库设计方案
https://cloud.tencent.com/developer/article/1347056
- 分布式DB水平切分中用到的主要关键技术:分库,分表,M-S,集群,负载均衡;
- 需求分析:一个大型互联网应用每天几十亿的PV对DB造成了相当高的负载,对系统的稳定性的扩展性带来极大挑战。
- 现有解决方式:通过数据切分提高网站性能,横向扩展数据层。水平切分DB,有效降低了单台机器的负载,也减小了宕机的可能性。
- 集群方案:解决DB宕机带来的单点DB不能访问问题。
- 读写分离策略:极大限度提高了应用中Read数据的速度和并发量。
分布式数据方案提供功能如下:
- (1)提供分库规则和路由规则(RouteRule简称RR),将上面的说明中提到的三中切分规则直接内嵌入本系统,具体的嵌入方式在接下来的内容中进行详细的说明和论述;
- (2)引入集群(Group)的概念,解决容错性的问题,保证数据的高可用性;
- (3)引入负载均衡策略(LoadBalancePolicy简称LB);
- (4)引入集群节点可用性探测机制,对单点机器的可用性进行定时的侦测,以保证LB策略的正确实施,以确保系统的高度稳定性;
- (5)引入主从读/写分离,提高数据的查询速度;
数据脱敏
- 数据脱敏也叫数据的去隐私化,在我们给定脱敏规则和策略的情况下,对敏感数据比如 手机号、银行卡号等信息,进行转换或者修改的一种技术手段,防止敏感数据直接在不可靠的环境下使用。
- 业界常见的脱敏规则有,替换、重排、加密、截断、掩码,用户也可以根据期望的脱敏算法自定义脱敏规则。
良好的数据脱敏实施,需要遵循如下两个原则,
- 第一,尽可能地为脱敏后的应用,保留脱敏前的有意义信息;
- 第二,最大程度地防止黑客进行破解。
数据脱敏分为静态数据脱敏和动态数据脱敏。
- 静态数据脱敏,是数据的“搬移并仿真替换”,是将数据抽取进行脱敏处理后,下发给下游环节,随意取用和读写的,脱敏后数据与生产环境相隔离,满足业务需求的同时保障生产数据库的安全。
- 动态数据脱敏,在访问敏感数据的同时实时进行脱敏处理,可以为不同角色、不同权限、不同数据类型执行不同的脱敏方案,从而确保返回的数据可用而安全。
二维码登录原理
场景题:app扫码浏览器的二维码登录怎么做的。以前没思考过,临场讲了下思路。然后问我服务端怎么主动将登录成功的信息推送给浏览器的?
https://zhuanlan.zhihu.com/p/110127600
https://www.cnblogs.com/hanease/p/15937766.html
美团
布隆过滤器
数据结构的一些,栈溢出场景,位图等等。
名单降序排序
手撕冒泡排序
选择排序和冒泡排序的区别
堆和栈有什么区别(jvm)
知道哪些数据结构以及他们的特点
- https://www.yijiyong.com/post/algorithm/03-commonalgorithmquestions.html#%E5%B8%B8%E7%94%A8%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84
- https://blog.csdn.net/i_silence/article/details/106991909
1. 数组
数组的优点:
- 随机访问速度较快(基于下标访问)。
- 实现简单,使用简单。
- 内存地址连续,对cpu缓存很友好,比如高性能队列 disruptor 也是利用了cpu缓存+数组地址的连续性大大的优化了性能。
数组的缺点:
- 内存连续可以是优点,也可以是缺点,如果在内存紧张的情况下,数组将会被大大限制。
- 插入和删除的时候会导致元素的移动(数据拷贝),较慢。
- 数组大小固定,大大的限制了元素的个数,对于很多动态的数据不友好。
2. 链表
链表的优点:
- 链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
- 删除插入不用移动其他元素。
- 不受元素大小限制,可以随意扩展。
链表的缺点:
- 失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
- 随机访问效率相对数组来说较低。
应用场景:
- 如果要解决的问题里面需要很多快速查询,链表可能并不适合;
- 如果遇到的问题中,数据的元素个数不确定,而且需要经常进行数据的添加和删除,那么链表会比较合适。
- 如果数据元素大小确定,删除插入的操作并不多,那么数组可能更适合。
3. 栈
特点:
- 栈的最大特点就是后进先出(LIFO)。对于栈中的数据来说,所有操作都是在栈的顶部完成的,只可以查看栈顶部的元素,只能够向栈的顶部压⼊数据,也只能从栈的顶部弹出数据。
实现:
- 利用一个单链表来实现栈的数据结构。而且,因为我们都只针对栈顶元素进行操作,所以借用单链表的头就能让所有栈的操作在 O(1) 的时间内完成。
应用场景:
- 在解决某个问题的时候,只要求关心最近一次的操作,并且在操作完成了之后,需要向前查找到更前一次的操作。如果打算用一个数组外加一个指针来实现相似的效果,那么,一旦数组的长度发生了改变,哪怕只是在最后添加一个新的元素,时间复杂度都不再是 O(1),而且,空间复杂度也得不到优化。
3. 队列
-
特点:和栈不同,队列的最大特点是先进先出(FIFO),就好像按顺序排队一样。对于队列的数据来说,我们只允许在队尾查看和添加数据,在队头查看和删除数据。
-
实现:可以借助双链表来实现队列。双链表的头指针允许在队头查看和删除数据,而双链表的尾指针允许我们在队尾查看和添加数据。
-
应用场景:直观来看,当我们需要按照一定的顺序来处理数据,而该数据的数据量在不断地变化的时候,则需要队列来帮助解题。在算法面试题当中,广度优先搜索(Breadth-First Search)是运用队列最多的地方。
双端队列
- 特点:双端队列和普通队列最大的不同在于,它允许我们在队列的头尾两端都能在 O(1) 的时间内进行数据的查看、添加和删除。
- 实现:与队列相似,我们可以利用一个双链表实现双端队列。
- 应用场景:双端队列最常用的地方就是实现一个长度动态变化的窗口或者连续区间,而动态窗口这种数据结构在很多题目里都有运用。
优先队列( Priority Queue)
- 特点:能保证每次取出的元素都是队列中优先级别最高的。优先级别可以是自定义的,例如,数据的数值越大,优先级越高;或者数据的数值越小,优先级越高。优先级别甚至可以通过各种复杂的计算得到。
- 应用场景:从一堆杂乱无章的数据当中按照定的顺序(或者优先级)逐步地筛选出部分乃至全部的数据。
- 实现:优先队列的本质是一个二叉堆结构。堆在英文里叫 Binary Heap,它是利用一个数组结构来实现的完全二叉树。换句话说,优先队列的本质是一个数组,数组里的每个元素既有可能是其他元素的父节点,也有可能是其他元素的子节点,而且,每个父节点只能有两个子节点,很像一棵二叉树的结构。
牢记三个重要的性质:
- 数组里的第一个元素 arrays[0]拥有最高的优先级别
- 给定一个下标i,那么对于元素array[i]而言:
- 它的父节点所对应的元素下标是(i-1)/2
- 它的左孩子所对应的元素下标是2*i+1
- 它的右孩子所对应的元素下标是2*i+2
- 数组里每个元素的优先级别都要高于它两个孩子的优先级别
优先队列最基本的操作有两个
-
向上筛选
- 当有新的数据加入到优先队列中,新的数据首先被放置在二叉堆的底部。
- 不断进行向上筛选的操作,即如果发现该数据的优先级别比父节点的优先级别还要高,那么就和父节点的元素相互交换,再接着往上进行比较,直到无法再继续交换为止。
- 时间复杂度:由于二叉堆是一棵完全二叉树,并假设堆的大小为k,因此整个过程其实就是沿着树的高度往上爬,所以只需要O(log k)的时间。
-
向下筛选
- 当堆顶的元素被取出时,要更新堆顶的元素来作为下一次按照优先级顺序被取出的对象,需要将堆底部的元素放置到堆顶,然后不断地对它执行向下筛选的操作。
- 将该元素和它的两个孩子节点对比优先级,如果优先级最高的是其中一个孩子,就将该元素和那个孩子进行交换,然后反复进行下去,直到无法继续交换为止。
- 时间复杂度:整个过程就是沿着树的高度往下爬,所以时间复杂度也是O(log k)
- 因此,无论是添加新的数据还是取出堆顶的元素,都需要O(log k)的时间。
初始化
- 优先队列的初始化是一个最重要的时间复杂度,是分析运用优先队列性能时必不可少的,也是经常容易弄错的地方。
- 误区 每当把—个数据加入到堆里,都要对其执行向上筛选的操作,这样一来就是
O(nlog n)
。 - 解法:在创建这个堆的过程中,二叉树的大小是从1逐渐增长到n的,所以整个算法的复杂度经过推导,最终的结果是
O(n)
。 - 注意:算法面试中是不要求推导的,你只需要记住,初始化大小为n的堆,所需要的时间是
O(n)
即可。
4. 树
- 在面试中常考的树的形状有:普通二叉树、平衡二叉树、完全二叉树、二叉搜索树、四叉树(Quadtree)、多叉树(N-ary Tree)。
- 对于一些特殊的树,例如红黑树(Red-Black Tree)、自平衡二叉搜索树(AVL Tree),一般在面试中不会被问到,除非你所涉及的研究领域跟它们相关或者你十分感兴趣,否则不需要特别着重准备。
关于树的考题,无非就是要考查树的遍历以及序列化(serialization)。
- 应用场景:在对某个节点进行分析的时候,需要来自左子树和右子树的信息。收集信息的操作是从树的底部不断地往上进行,好比你在修剪一棵树的叶子,修剪的方法是从外面不断地往根部将叶子一片片地修剪掉。
注意:
-
掌握好这
三种遍历的递归写法和非递归写法
是非常重要的,懂得分析各种写法的时间复杂度和空间复杂度同样重要。 -
无论是前端工程师,还是后端工程师,在准备面试的时候,树这个数据结构都是最应该花时间学习的,既能证明你对递归有很好的认识,又能帮助你学习图论。
-
树的许多性质都是面试的热门考点,尤其是二叉搜索树(BST)(二叉搜索树的性质:对于每个节点来说,该节点的值比左孩子大,比右孩子小,而且一般来说,二叉搜索树里不出现重复的值)。
5. 图
图可以说是所有数据结构里面知识点最丰富的一个,最基本的知识点如下:
- 阶、出度、入度
- 树、森林、环
- 有向图、无向图、完全有向图、完全无向图
- 连通图、连通分量
- 存储和表达方式:邻接矩阵、邻接链表
链表增删快,那如何提高其查询效率,有没有什么想法?
1、参考LRU问题,可以在链表的基础上加一个hashmap
2、参考redis中的跳表结构,其实现大概就是给链表加索引,但是要保证链表有序
跳表的查询时间复杂度为O(logn ),
LRU算法了解吗?你会如何实现它?这个算法可以应用在哪些场景下?
LRU (Least recently used:最近最少使用)最近被访问的,被访问的几率变大。最少被访问的,当磁盘被写满时,会被清除。
LRU应用场景
- 底层的内存管理,页面置换算法
- 一般的缓存服务,redis等缓存排序。每个被访问频繁的缓存都应该被排到前面去,超过缓存大小的数据就应该被删除掉。
跳表了解吗?
跳表搜索
时间复杂度平均 O(logN),最坏O(N),
空间复杂度O(2N),即O(N)
跳表实现
【力扣编程!!】
//跳表结点
typedef struct zskiplistNode {
//Zset 对象的元素值
sds ele;
//元素权重值
double score;
//后向指针
struct zskiplistNode *backward;
//节点的level数组,保存每层上的前向指针和跨度
struct zskiplistLevel {
struct zskiplistNode *forward;
unsigned long span;
} level[];
} ;
//跳表
typedef struct zskiplist {
//跳表头尾结点
struct zskiplistNode *header, *tail;
//跳表长度
unsigned long length;
//跳表最大层数
int level;
};
- Redis的跳跃表实现由
zskiplist
和zskiplistNode
两个结构组成,其中zskiplist
用于保存跳跃表信息(比如表头节点header、表尾节点tail、长度length、层数level),而zskiplistNode
则用于表示跳跃表节点,包含各层、前进指针、后退指针、score、成员对象等。 - 跳表是一种实现起来很简单,单层多指针的链表,它查找效率很高,堪比优化过的二叉平衡树,且比平衡树的实现。
查找的过程
查找一个跳表节点的过程时,跳表会从头节点的最高层开始,逐一遍历每一层。在遍历某一层的跳表节点时,会用跳表节点中的 SDS 类型的元素和元素的权重来进行判断,共有两个判断条件:
- 如果当前节点的权重「小于」要查找的权重时,跳表就会访问该层上的下一个节点。
- 如果当前节点的权重「等于」要查找的权重时,并且当前节点的 SDS 类型数据「小于」要查找的数据时,跳表就会访问该层上的下一个节点。
如果上面两个条件都不满足,或者下一个节点为空时,跳表就会使用目前遍历到的节点的 level 数组里的下一层指针,然后沿着下一层指针继续查找,这就相当于跳到了下一层接着查找。
查询过程:找到每层最后一个权重score小于 key 的节点,然后走向下一层;直到最后一层,继续向后走一步,如果当前值和目标值相等,则返回,否则没有该目标值。
大顶堆、小顶堆了解吗?
大顶堆:每个结点的值都大于或等于其左右孩子结点的值
小顶堆:每个结点的值都小于或等于其左右孩子结点的值
小顶堆的应用
1、求最大的k个数
2、数组中的第K个最大元素
大顶堆的应用
1、要选择最小的K个数使用大顶堆,每次取数组中剩余数与堆顶的元素进行比较,如果新数比堆顶元素小,则删除堆顶元素,并添加这个新数到堆中。
2、数组中的第K个最小元素
堆排序;
1、LRU 某操作系统采用 LRU 作为内存页面置换算法。
- 假设初始内存为空,现给定将访问的内存页序列 pages, 序列长度 page_cnt 和内存总容量(页面数) mem,请返回缺页中断的次数。
- 例如:序列 pages = 1, 2, 3, 2, 1, 4; 内存 mem = 2
返回:5
int check_page_faults(int pages[], int page_cnt, int mem);
2、表达式比较
- 注意:这里不能直接把 a-z 当成 1-26 来计算,如果这样做的话,第五个例子就会错了。
- 检查两个表达式是否等价。表达式仅包含小写字母
'a'-'z', '+', '-', '(', ')'
,且表达式里的未知数仅有一个字符。
例如:
1) exp1 = "a+b+c-a", exp2 = "(b+c)", result: true
2) exp1 = "a-b-c", exp2 = "a-(b+c)", result: true
3) exp1 = "a-b+c", exp2 = "a-(b+c)", result: false
4) exp1 = "a-b+c", exp2 = "a-(b-(c-d)-d)", result: true
5) exp1 = "a+d", exp2 = "b+c", result: false
bool check(const char* exp1, const char* exp2);
3、恢复 IP 地址
给一个由数字组成的字符串,求出所有可能的 IP 地址。
例如:给出字符串 “25525511135”,所有可能的 IP 地址为:
[ “255.255.11.135”, “255.255.111.35” ]
vector<string> restore_ip_addrs(const string& s);
4、 对输入的数组按出现的频率进行排序,若出现频率一致则按数字升序排序。
例如:1, 2, 4, 9, 4, 1, 4, 2, 结果为:4, 4, 4, 1, 1, 2, 2, 9
void sort(int arr[], int n);
5. 给定一个排序链表,删除所有重复的元素,只留下原链表中没有重复的元素。
例如: 1->1->2->3->3->4->4->5->6->6->null, return: 2->5->null
struct LinkNode {
int value;
struct LinkNode * next;
};
struct LinkNode* delete_duplicates(struct LinkNode* head);
堆排序
1)数字在排序数组中出现的次数
2)链表问题
1、单机里面有多个文件,每个文件包含若干个整数,找出这些文件中的值最大的k个数:
讲了下单线程和多线程的处理方式,单线程直接用一个小根堆,然后遍历每个文件;
多线程的话,就对每个文件建一个小根堆,取得这个文件的top k,然后对这 k 个数排序,最后将每个文件拿到的结果来建一个大根堆,依次取出top k。
给定一个数组,里面的元素先是升序,再降序,比如 [1, 3, 5, 4, 2],找出最大的元素的下标:
倒转单链表(在原链表上倒转)
数字1-N 分布在长度为N+1的数组里面,一个元素重复1次,请求重复的元素?
时间复杂度O(N) 空间复杂度O(1)
问题:给定一个字符串,将后m个字符移到整个字符的前面。例 str = “abcd12” m=2,输出 “12abcd”
- ①先写了一个最低级的双重for循环把最后m个字符依次和前面交换换到最前。时间复杂度O(mn)。面试官说需要优化一下
- ②继续写了一个临时变量存后m个字符,然后把全部前面的字符从后往前直接覆盖到字符串尾部。时间复杂度O(n),空间复杂度O(m)。面试官说时间复杂度可以但是空间复杂度还不好
- ③最后说思路,在m已知的情况下,每个字符的位置是已知的,就比如前面的字符,index为x那么新的字符串中它的index会变为x+m,这样就可以直接把每个字符都放到它们最终的位置,只需要固定的额外内存来存一个字符的备份以及其他变量。
此时时间复杂度O(n),空间复杂度O(1)。
(太紧张了,这个小题整了好久才达到最优的解法)
求数组交集:排序去重/双指针/map记录
求树的深度:递归/层序遍历/深度遍历
题:lc75:颜色分类
题:lc15:三数之和
题:搜索旋转后的排序数组
算法题leetcode- 23.合并K个升序链表(更改了一下参数,总体来说还好)
算法:给出[[1, 2], [3, 5], [8, 8], [15, 16], [32, 38]],求间隔
队列的实现,需要注意的地方
快速排序的实现、时间复杂度分析
算法:蛇形打印二叉树
讲讲平衡搜索树;
什么是平衡二叉树;
排序算法和对应的时空复杂度;
排序算法的稳定性是指什么意思
算法题:有一个映射表{1->A,2->B,……,26->Z},给你一个字符串,求出其能映射出多少个字符串,如123可以映射ABC,AW,等。
算法题:写一个String类型转换成对应的double的方法。
数组和链表的区别;算法题(不难)
数组链表区别;
两道算法题:快速写反转链表,要求在原链表上操作;求最长递增子序列,1长度2序列3长度最长数字最小的序列
编程题:用rand5实现rand3,rand7,要求等概率
说一下virtual table
一个类的大小怎么计算
编程题:二维矩阵旋转90度,要求不额外使用空间
二叉树后序遍历
1.货币兑换
题目描述:每两种货币之间有兑换汇率,但是不能保证任何两种货币之间都可以兑换,比如:USD-RMB:1:6.6,EUR-RMB:1:7.1,USD-GREEK:1:1.3,UER-GREEK:1:1.4。输入任意两种货币,输出这两种货币的兑换汇率是多少。
public double transfer(String source, String target)
思路提醒:用什么数据结构进行存储比较方便?是否考虑一下图
2.地址简化
题目描述:文件路径表示:/a/b/c,路径中存在点(.),把路径中的点(.)去掉,简化路径的表示。
比如:
/a/b/./c => /a/b/c,
/a/b/../c => /a/c,
/a/b/./c/../d/../../e ,/.. => Exception,
/./,/..等等
思路提醒:使用split()函数
堆了解多少
算法:建堆和堆排
实现字典树
两个有序链表的合并,楼主写了递归,要求再写一个循环的。
容器、迭代器和算法的关系
STL的sort函数是怎么实现的?
快速排序的最坏时间复杂度
如何改进快速排序避免陷入最坏时间复杂度的情况?
算法题1: LC15 三数之和
三数之和即将写完,< 第二次牛客网断连 >
面试官要求再做一题,算法题2:LC146 LRU
实际上用的牛客的 OJ NC93 设计LRU缓存结构
1. sql 很简单的题,写一写或者讲一讲,但是楼主很久没写了,稍微讲了讲&写了个伪代码。。。
2. leetcode32. 最长有效括号,
之前没看过,一开始写了个二维dp,做法有点问题(坦率的讲,俺知道有点问题,但是没混过去,面试官还是很厉害的),在提示是一个一维dp的情况下做出来了,然后让着把输入输出写全,没实际跑。
3. 上个题的若干强化
- 强化1:扩充括号种类[] {},怎么做
- 强化2: 加上’'和"",这种不分左右的括号怎么做
- 强化3:有两种更改方式,最小化变为合法括号的次数。更改方式1:改变括号种类;更改方式2:在尾部加入括号。
4. 反问:问他们是不是运维,做的事情是啥,框架是自己写还是用开源的。
一些感想(时间不充裕的友友这块就可以不看了):
5. 一个循环数组长度为n,请问最长能存储多少个数据?
(没太听懂意思,就说n-1,考虑头尾指针如果不是另存的话,需要空一格)
6. 堆排序的过程(大致说一下),时间复杂度(已经懵了,说n^2,当然是nlogn)
手撕代码:给你一个数组和一个target,从数组中寻找三个数 a,b,c 使得 abs(a+b+c - target) 最小;
解法:排序,便利固定一个数,剩余的两个数用双指针寻找,不是很难。
1、删除链表中的重复元素;
2、链表中小于等于target的值排在大于target的值前面。
1. 有序二维数组找target,找到返回坐标,找不到返回[-1, -1];
2. 树的根节点到叶子节点的所有路径和。
建堆(heap)的复杂度:
如果已经有全部数据,那就从下到上建堆,O(N);
如果是数据流,只能从上到下建堆,O(N*logN)
给定m * n矩阵matrix,可以从任意位置开始,向上、向下、向左、向右移动,但要求下一个位置上的元素要大于当前元素,找出矩阵中最长的递增路径的长度。
sql题 :给定一个表 T(id, name, age, sex, city),写出一下查询语句:男性平均年龄最高的城市。
概率题:一种流行病患病概率是1%,有一种检测试纸,检测的准确率是99%,我现在试纸检测阳性了,请问我患病的概率有多大? (概率论有点忘了)
用一个[0,4)的随机数生成器rand4(),模拟一个[0.6)的随机数rand6() - 常见题,直接口述
32个石块,重量不等,用天平来进行衡量,找出最重的石块,最少需要几次? - 考官提示了一下,用归并的方法,应该是31次
如果是找出最重的两块,需要几次?我答了46次,看网上有的人说31次,感觉不是很对。
1)数组中其他数出现两次有一个数出现一次找出这个数
2)数组中其他数出现两次,有一个数出现一次找出这两个数
3)链表 A->B->C->D->E 变成B->A->D->C->E
4)单调栈问题 数组中找出右边第一个比这个数大的数
比如数组合[2,10,5,8,1,2,13,12,11]
输出: [10,13,13,13,13,13,-1,-1,-1]
1、给定数组,每个元素代表一个木头的长度,木头可以任意截断,从这堆木头中截出至少k个相同长度为m的木块,已知k,求max(m)。
稀里糊涂地说出来思路,以为错了就没浪费时间写代码,结果面试快结束的时候面试官说我刚才说的思路是对的。。。陷入自责。
2、 数据结构:时间复杂度O(1)的gemin()最小栈
3、 [8,1, 9, 10, 3, 5] 每次获取一个值,不能获取相邻的,求最大值,
比如第一次取出了8,第二次不能取1
智力测试 64匹马 八个赛道 求定位出前四名要进行几次比赛(当然是不可以计时了呀)
有一列房子,给出每个房子所需的涂料数量,要求尽可能多的使用白色涂料,求可能使用的最大涂料数量
给定一个矩阵,每个格子都有一个数值,从左上角出发,只能向右和向下走,求走到右下角时经过的所有格子的数值和的最大值
有几类硬币,每类都有无限多个,给定一个总值,求有几种表示方式
带精度的sqrt
链表重排列 12345变成15243
完全二叉树与搜索二叉树的概念
o 通过给定的tree,判断是不是搜索二叉树和完全二叉树
用中序遍历和广度优先法
给定一个随意的正整数数组,求最长的连续数字长度
eg. [3, 8, 9, 4, 6, 7] => 4 (6789)
刚开始用了桶排序,后面在面试官的提示下用map优化了一下
给定一个数组和一个数s,找到最短的子数组加起来的和超过s
用两个指针去遍历 讲了一遍思路 面试官让我开始写 写了十分钟还有bug 面试官让我先跳过了(真是想吐槽一下牛客的IDE)
算法:给出两个升序数组A、B和长度m、n,求第k个大的数
算法:给出数组A,长度为n,数组中元素的值位于[0, n - 1]之间,求是否有重复元素
算法:lc.560改编。
用静态内部类写了个TreeNode,在面试的平台上会报错,面试官也没看出来是为什么。最后问面试官如何评价我的表现,面试官反问我自己觉得怎么样)
算法题:由前序遍历中序遍历重建子树,然后再前序遍历输出;
随机数求根(二分法)
有N个筐,每一个筐有一定数量苹果,把苹果从一个筐移到另一个筐的花费为距离大小,求需要让每个筐中的苹果数量相等,的最小花费;
问我一个贪心的思路,面试官让证明,不会。
Java后端各科最全八股自用整理,获取方式见
:
整理不易🚀🚀,关注和收藏后拿走📌📌欢迎留言🧐👋📣✨
快来关注我的公众号🔎AdaCoding 和 GitHub🔎 AdaCoding123