后台开发面经1

1、八大数据结构及分类

  • 1、数组 频繁查询,对存储空间要求不大,很少增加和删除的情况
  • 2、栈 栈常应用于实现递归功能方面的场景,例如斐波那契数列
  • 3、队列 因为队列先进先出的特点,在多线程阻塞队列管理中非常适用
  • 4、链表 数据量较小,需要频繁增加,删除操作的场景
  • 5、树 二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。
  • 6、散列表 哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃
  • 7、堆 因为堆有序的特点,一般用来做数组中的排序,称为堆排序
  • 8、图

https://blog.csdn.net/yeyazhishang/article/details/82353846

因为哈希表是基于数组衍生的数据结构,在添加删除元素方面是比较慢的,所以很多时候需要用到一种数组链表来做,也就是拉链法。拉链法是数组结合链表的一种结构,较早前的hashMap底层的存储就是采用这种结构,直到jdk1.8之后才换成了数组加红黑树的结构。

图是一种比较复杂的数据结构,在存储数据上有着比较复杂和高效的算法,分别有邻接矩阵 、邻接表、十字链表、邻接多重表、边集数组等存储结构

2、堆栈特点及应用

栈:特点就是一个先进后出的结构。
队列:特点就是一个先进先出的结构。

栈的应用:非常广泛,在CPU内部就有提供栈这个机制。主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。在CPU内部栈主要是用来进行子程序调用和返回中断时数据保存和返回在编程语言中:主要用来进行函数的调用和返回。可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。

队列的应用:队列主要用在和时间有关的地方,特别是操作系统中,队列是实现多任务的重要机制。windows中的消息机制就是通过队列来实现的。进程调度也是使用队列来实现,所以队列也是一个重要的机制。只要满足数据的先进先出原理就可以使用队列。

3、链表和数组的区别

不同:

  1. 链表是链式的存储结构;数组是顺序的存储结构。(物理地址存储的连续性)
  2. 链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。(存储元素不同,前者指针+值,后者值)
  3. 链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;
  4. 数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。

相同:两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。

区别一:物理地址存储的连续性
数组的元素在内存中是连续存放的。
链表的元素在内存中不一定是连续存放的,通常是不连续的。
区别二:访问速度
数组的访问速度很快,因为数组可以根据数组可以根据下标进行快速定位。
链表的访问速度较慢,因为链表访问元素需要移动指针。
区别三:添加、删减元素速度
数组的元素增删速度较慢,因为需要移动大量的元素。
链表的元素增删速度较快,因为只需要修改指针即可。

4、介绍下树,前缀树的应用场景,可以怎样优化

前缀树也叫字典树,常用语字符串的查找。

字典树==前缀树==Trie树:

查询某个单词(前缀)在所有单词中出现次数的一种数据结构

查询和插入时间复杂度都是O(n),是一种以空间换时间的方法。

详细介绍参考于: https://www.cnblogs.com/vincent1997/p/11237389.html (需要详细看

https://blog.csdn.net/aiphis/article/details/48247469

应用:

前缀树有着广泛的应用,例如自动补全,拼写检查、搜索单词、搜索前缀等等

5、并发编程,说一下理解,线程池的优缺点(看详细内容)

1. 什么是线程池?

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

通俗点讲,线程池就是一个容器,集中管理线程。线程使用完毕不会销毁,而是会先存储在线程池内。

2. 提交一个任务到线程池中,线程池的处理流程如下:

1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。

2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。

3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

https://blog.csdn.net/jiao1902676909/article/details/88980110

3. 线程池的优缺点

1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。

2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。

4、线程处理流程:

创建的线程池具体配置为:核心线程数量为5个;全部线程数量为10个;工作队列的长度为5

刚开始都是在创建新的线程,达到核心线程数量5个后,新的任务进来后不再创建新的线程,而是将任务加入工作队列,任务队列到达上限5个后,新的任务又会创建新的普通线程,直到达到线程池最大的线程数量10个,后面的任务则根据配置的饱和策略来处理。我们这里没有具体配置,使用的是默认的配置AbortPolicy:直接抛出异常。

一个应用场景

linux高并发的实现,线程池的实现思想,怎样处理高并发就比如说,用迅雷看电影。一边下载,一边播放。这个时候下载进程和播放进程,他们两个就有同步的机制,例如:只能播放视频文件中已经下载完成的部分,没有下载的不能播放。

https://blog.csdn.net/chenkaifang/article/details/81428799

6、并发和并行的区别

并发是轮流处理多个任务,并行是同时处理多个任务

https://www.jianshu.com/p/cbf9588b2afb

7、递归需要考虑一些什么

①一个函数在他的函数体内调用他自身称为递归调用,执行递归函数将反复调用其自身,每执行一次进入新的一层。

②为防止递归函数无休止的进行,必须在函数内有终止条件。

③对于一个函数只要知道他的递归定义式和边界条件,就可以编递归函数。

层数不能太多,在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

充分必要条件是:问题具有某种可借用的类同自身的子问题描述的性质;某一有限步的子问题(也称本原问题)有直接的解存在。

8、动态规划与递归

递归算法就是通过解决同一问题的一个或多个更小的实例来最终解决一个大问题的算法。为了在C语言中实现递归算法,常常使用递归函数,也就是说能调用自身的函数。递归程序的基本特征:它调用自身(参数的值更小),具有终止条件,可以直接计算其结果。

在使用递归程序时,我们需要考虑编程环境必须能够保持一个其大小与递归深度成正比例的下推栈。对于大型问题,这个栈需要的空间可能妨碍我们使用递归的方法。

一个递归模型为分治法,最本质的特征就是:把一个问题分解成独立的子问题。如果子问题并不独立,问题就会复杂的多,主要原因是即使是这种最简单算法的直接递归实现,也可能需要难以想象的时间,使用动态规划技术就可以避免这个缺陷。

可以按照从最小开始的顺序计算所有函数值来求任何类似函数的值,在每一步使用先前已经计算出的值来计算当前值,我们称这项技术为自底向上的动态规划。只要有存储已经计算出的值的空间,就能把这项技术应用到任何递归计算中,就能把算法从指数级运行时间向线性运行时间改进。

性质:动态规划降低了递归函数的运行时间,也就是减少了计算所有小于或等于给定参数的递归调用所要求的时间,其中处理一次递归调用的时间为常量。

具体详见于https://blog.csdn.net/DeepIT/article/details/6530282

在自顶向下的动态规划中,我们存储已知的值;在自底向上的动态规划中,我们预先计算这些值。我们常常选择自顶向下的动态规划而不选自底向上动态规划,其原因如下:

1 自顶向下的动态规划是一个自然的求解问题的机械转化。

2 计算子问题的顺序能自己处理。

3 我们可能不需要计算所有子问题的解。

我们不能忽视至关重要的一点是,当我们需要的可能的函数值的数目太大以至于不能存储(自顶向下)或预先计算(自底向上)所有值时,动态规划就会变得低效。自顶向下动态规划确实是开发高效的递归算法实现的基本技术,这类算法应纳入任何从事算法设计与实现所需的工具箱。

相关编程题目整理

https://www.cnblogs.com/threetop/p/9075349.html

https://blog.csdn.net/qq_35556064/article/details/82503076

9、数据库的连表查询和嵌套查询,分页查询

10、数据库增删查改语句重复应该考虑什么

11、存储引擎,InnoDB

12、如何实现浏览器和服务器之间的通信

13、单例模式,实现方法,应用场景

14、生产者和消费者模式应用场景

15、算法题:156个元素数组,二分查找最少要多少次比较,最多多少次

16、进程和线程的区别,协程,同步机制

17、数据库索引,存储引擎

18、项目难点

19、生成订单号的实现

20、Redis 的数据结构

21、最近在看什么书,这么多看得完吗

22、多线程同步的方法

23、wait 和 notify 以及 notifyAll

24、HashMap 查找效率最低和最高

25、TCP 中 time-wait 状态

26、CPU 占用率达到 100% 可能由什么造成

27、服务调用超时可能由什么造成

28、数据库中,怎样理解这个非关系和关系这个概念的

29、redis相关

30、几种设计模式

31、线程通信

32、mysql存储引擎

33、什么是索引、怎么设置索引

34、什么样的时候做索引,举例说明

35、什么样的不适合做索引,举例说明

36、mysql底层原理说一下

37、数据库序列化

38、内存分区(5个)

39、基础

  • 进程和线程
  • 进程通信
  • 线程通信
  • 锁,乐观锁悲观锁
  • 为啥要锁,有什么注意事项吗
  • 细问了锁和同步的相关知识,比较碎

算法设计

  • 贪吃蛇游戏的设计思路

40、最长公共前缀

41、测试岗

  • 项目介绍
  • 白盒测试方法
  • 黑盒的等价类,因果图
  • 数据库查找某个字符
  • HTTP请求头
  • GET/POST
  • 状态码304/403
  • 测试微信朋友圈发文字的功能
  • 口述找出字符串第一个不重复字符的代码

42、常用状态码

43、基础

你有提到伪数组,说一下伪数组

伪数组怎么转化为数组?

怎么判断一个元素是不是数组?

25. 哪些会改变原数组?

26. 现在查找数组的第一项和查找数组的第9999项,效率一样吗?为什么?

27. 删除数组的第一项和删除数组的第9999项效率呢?

28. 关于存储元素上,什么时候用数组这样的结构效率高,什么时候用字典结构的对象这样的结构效率高?

29. 说一下继承

30. 为什么new了就可以实现继承

31. 说一下new发生了啥

32. new存在隐式返回对吧,那我函数里面 return 1 现在new完之后返回什么?

33. 数组扁平化的问题,我看你用了三行代码,怎么用一行代码解决

42. git 常用命令哪些?

43. git怎么合并指定提交记录的分支?

44. http协议说一下

45. 说一下https和http的区别

46. 为什么https安全?

47. 那https会不会带来性能问题?

48. 说一下http1.0和http1.1的主要区别

49. http2.0了解过吗?详细说一下

50. 知道强缓存和协商缓存吗?说一下

51. 说一下协商缓存的详细流程

44、霍夫曼树

霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树

原文地址:https://www.cnblogs.com/GuoXinxin/p/11691262.html

时间: 2024-11-25 20:42:43

后台开发面经1的相关文章

入我新美大的Java后台开发面试题总结

静儿最近在总结一些面试题,那是因为做什么事情都要认真.面试也一样,静儿作为新美大金融部门的面试官,负责任的告诉大家,下面的问题回答不上来,面试是过不了的.不过以下绝不是原题,你会发现自己实力不过硬,最终肯定是被问出来的. 1>如何定位线上服务OOM问题 2>JVM的GC ROOTS存在于那些地方 3>mysql innodb怎样做查询优化 4>java cas的概念 下面静儿就以自己面试的标准简单回答一下这些题怎样回答算过关. 1>如何定位线上服务OOM问题 因为面试主要是看

三面腾讯,已拿offer!分享复习经验和后台开发面经(附赠复习资料)

紧张的准备了一个多月,终于拿到最想要的offer啦!这一个多月刷了挺多题,也看了许多笔经面经 复习过程 项目准备: leetcode:刷完剑指之后每天会刷2-4道leetcode java基础: 主要刷面经.重点掌握垃圾回收机制 操作系统: 之前没学过,用几天时间看了一下最重要的进程线程.死锁.消费者生产者.哲学家问题.银行家算法 计算机网络:花几天时间复习了一下,重点复习tcp(三次握手四次挥手拥塞控制流量控制).udp.https 数据库: 重点了解了索引的实现以及引擎的区别 数据结构和算法

Java后台开发面试题总结

1>如何定位线上服务OOM问题 2>JVM的GC ROOTS存在于那些地方 3>mysql innodb怎样做查询优化 4>java cas的概念 Java服务OOM,比较常见的原因是 ?? 有可能是内存分配确实过小,而正常业务使用了大量内存 比如jmp -heap命令可以查看新生带,老年代内存大小的情况.看看内存本身是否分配过小. ?? 某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽 ,比如jmap -histo:live 对象显示存活对象的信息,并按照所占内存大小

oracle 数据库开发面试题

最近参加了4.5场面试,总结一下竞聘oracle 开发岗位最常问到哪些问题: 1.delete 与 truncate 区别? 1)truncate 是DDL语句,delete 是DML语句: 2)truncate 速度远快于 delete: 原因是:当我们执行delete操作时所有表数据先被copy到回滚表空间,数据量不同花费时间长短不一.而truncate是直接删除数据不进回滚表空间. 3)接(2)这也就导致了delete数据后我们可以运行rollback进行数据回滚,而truncate则是永

大公司移动前端开发面试题——做转盘

"如果有个做转盘的需求,你准备怎么做?设计师只会提供一个转盘的图片,其余都需要你完成,不能用框架和类库." "这个转盘没有惯性的需求,只要求在手机上,用手指拖转盘,能让转盘跟随手指转起来即可." 这是我在面试前端开发人员时,经常会问到的一道题.转盘是类似上图的样子. 博主之前在M公司和C公司的时候,经常用这题面试移动前端开发工程师.M公司的产品和设计是美国团队,在个别项目上UI设计比较大胆脱俗,对前端开发人员有较高的要求.C公司的只会JS的前端开发人员占比较大,产品

《App后台开发运维和架构实践》推荐序

软件开发工具的成长速度远远超过开发人员的成长速度,这是现实. 每个月,甚至每天,我们都可以见到新的类库.框架.工具.语言.它们或者极大地降低了开发的成本,或者极大地提升了开发的效率. 随之而来的问题就是,如何让开发人员妥善地运用好这些工具? 曾经有好几个做开发的同事跟我说:"写软件谁不会?从网上找些开源的类和项目来改改就是了".目前也确实充斥着这种"改改就是"的工作思维.介绍某个类库和项目如何安装和调用的文章俯拾皆是. 但是每种工具究竟有什么优缺点?适合用来解决什么

Web开发面试题

标签:Web开发面试题 HTML+CSS1.对WEB标准以及W3C的理解与认识标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户所访问.内容能被更广泛的设备所访问.更少的代码和组件,容易维 护.改版方便,不需要变动页面内容.提供打印版本而不需要复制内容.提高网站易用性: 2.xhtml和html有什么区别HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML

大公司移动前端开发面试题——做转盘[参考代码]

题目在此 http://www.cnblogs.com/arfeizhang/p/turntable.html 这几天一直在忙,终于找到时间把参考代码放出来了.大家参考一下. 参考代码考虑到让入行不久的前端也看得懂,没有进行封装.变量名也没有进行简写,尽量一看就明白. 图片随手在网上截的,也许没有对准圆心.这段代码只考虑了webkit内核的浏览器,没做兼容.重在让大家弄懂原理. :P 如果感到有些卡帧,可能是转盘图片带来的效果.在调试器上试过,能维持50-60帧,流畅度还是让人满意的.在LG G

前端开发面试题收集 JS

前端开发面试题收集-JS篇 收集经典的前端开发面试题 setTimeout的时间定义为0有什么用? javascript引擎是单线程处理任务的,它把任务放在队列中,不会同步执行,必须在完成一个任务后才开始另一个任务. 由于setTimeout可以把任务从某个队列中跳出成为新队列,因此能够得到期望的结果. 怎么理解this this指向的总是调用函数的那个对象. this一般情况下,是全局对象Global. 什么是闭包 闭包是一个概念,我的理解是函数里的函数,能够读取函数内部变量的函数. 就是将函