热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

近期某面试汇总以及之后的规划

文章目录引言面试题总结哈希表的设计要求和执行过程请讲出常用的设计模式和设计理念HTTP中四次挥手的等待时间numpy和pandas数组有什么区别restful盛行最本质的原因是什么

文章目录

  • 引言
  • 面试题总结
    • 哈希表的设计要求和执行过程
    • 请讲出常用的设计模式和设计理念
    • HTTP中四次挥手的等待时间
    • numpy和pandas数组有什么区别
    • restful盛行最本质的原因是什么?
    • 说说你接近两年,做过你比较得意的或者理解得较深的东西
  • 结尾


引言

今年的行情确实如疫情发展得一样,岗位非常少,并且甲方的难度有点难过,大部分都不问项目,而是直接底层了,问得头皮发麻,和去年相比,问的问题都是两个层次,这也导致我迷茫了很长一段时期,因为本身我自己的硬性条件就不是很好,可能要考虑转型,计划从学go变成Java,如果不出意外的话,我也需要拿出跟以前一样的热情去迎接新的挑战了:



面试题总结

哈希表的设计要求和执行过程


要设计一个哈希表首先要做的就是散列函数的计算,通过散列函数就可以将键转换为数组的索引。其实哈希函数的设计是一个非常常见的一个研究方向,就像在我们的网络安全的密码设计的过程中,散列函数就是一个非常重要的理论。

当时被问到这个问题的时候真的是懵的,不过幸好已经提前开始看Java了,说了一通jvm,也不管面试官有没有听懂,反正我自己是理解得不太行。所以在这里看看别人的帖子再总结一下:

哈希表的设计要求(最好有数学公式??):

举个例子:

166=1∗102+6∗101+6∗100166 = 1* 10^2 + 6 *10^1+ 6*10^0166=1102+6101+6100

hash(code)=(c∗B3+o∗B2+d∗B1+e∗B0)%Mhash(code) =(c*B^3+o*B^2+d*B^1+e*B^0)\%Mhash(code)=(cB3+oB2+dB1+eB0)%M

hash(code)=((((c%M)∗B+o)%M∗B+d)%M∗B+e))%Mhash(code) =((((c\%M)*B+o)\%M*B+d)\%M*B+e))\%Mhash(code)=((((c%M)B+o)%MB+d)%MB+e))%M

其实左后就准换成为上面公式的样子,其中B表示进制,M表示模的素数。这也只是单类型转换,如果是组合类型,将是:

hash(student)=(((student.name%M)∗B+student.number)%M∗B+student.socre)%Mhash(student) = (((student.name\%M)*B + student.number)\%M*B + student.socre)\%Mhash(student)=(((student.name%M)B+student.number)%MB+student.socre)%M

然后就是三种方法:链地址法(拉链法)、动态空间处理和开放地址法,这里我详细看了下动态空间处理法:

我们上实现的时候把M的值取成了固定值,这个时候我们来分析下他的时间复杂度:

如果放入哈希表中的元素的个数使N,每个地址中存放的元素的个数是N/M的,然后每个地址中存放的是TreeMap,也就是底层是红黑树,对于一个红黑树的查询一个元素的时间复杂度是O(logN/M)的。然而对于哈希表其实是查询的复杂度应该是O(1)的复杂度,因为底层就是数组,直接索引一个数组中的值也就是O(1)的复杂度。

但是这里明显不符合啊?其实就是开辟的空间是固定的导致的,我们需要进行动态空间处理。怎么处理呢?其实就是把和动态数组的处理是一样的。当元素的个数大于阈值的时候就扩大空间,小于阈值时就压缩空间,具体如下:

当平均每个地址承载的元素多过一定程度时就扩容:n/M >= upperTol;

当平均每个地址承载的元素少于一定程度时就缩容:n/M

然后还可以看看jdk7中对于hashmap中的解释:Java7源码浅析——对HashMap的理解

public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable
{/*** The default initial capacity - MUST be a power of two.*/static final int DEFAULT_INITIAL_CAPACITY &#61; 16;/*** The maximum capacity, used if a higher value is implicitly specified* by either of the constructors with arguments.* MUST be a power of two <&#61; 1<<30.*/static final int MAXIMUM_CAPACITY &#61; 1 << 30;/*** The load factor used when none specified in constructor.*/static final float DEFAULT_LOAD_FACTOR &#61; 0.75f;

衍生题&#xff1a;面试中关于HashMap的时间复杂度O(1)的思考

public V get(Object key) { if (key &#61;&#61; null) return getForNullKey(); int hash &#61; hash(key.hashCode()); for (Entry<K,V> e &#61; table[indexFor(hash, table.length)]; e !&#61; null; e &#61; e.next) { Object k; if (e.hash &#61;&#61; hash && ((k &#61; e.key) &#61;&#61; key || key.equals(k))) return e.value; } return null; }

请讲出常用的设计模式和设计理念

这题问得很笼统&#xff0c;不过在很久之前我因为做了实验楼的一个实验&#xff0c;写了一篇python版的创建型模式&#xff0c;然后大致答到了单例、工厂、装饰器和代理&#xff0c;不过因为太长时间没看&#xff0c;还是接近于想到啥说啥&#xff0c;很混乱&#xff0c;被说理解得有问题确实没啥毛病&#xff0c;但确实琢磨不出来深度原理。。。这里看到一篇帖子就顺手记录一下&#xff1a;

范围创建型结构型行为型
Factory Method&#xff08;工厂方法&#xff09;Adapter(类) &#xff08;适配器&#xff09;Interpreter&#xff08;解释器&#xff09;
Template Method&#xff08;模版方法&#xff09;
对象Abstract Factory&#xff08;抽象工厂&#xff09;
Builder&#xff08;建造者&#xff09;
Prototype&#xff08;原型&#xff09;
Singleton&#xff08;单例&#xff09;
Bridge&#xff08;桥接&#xff09;
Composite&#xff08;组合&#xff09;
Decorator&#xff08;装饰者&#xff09;
Façade&#xff08;外观&#xff09;
Flyweight&#xff08;享元&#xff09;
Proxy&#xff08;代理&#xff09;
Chain of Responsibility&#xff08;职责链&#xff09;
Command&#xff08;命令&#xff09;
Iterator&#xff08;迭代器&#xff09;
Mediator&#xff08;中介者&#xff09;
Memento&#xff08;备忘录&#xff09;
Observer&#xff08;观察者&#xff09;
State&#xff08;状体&#xff09;
Strategy&#xff08;策略&#xff09;
Visitor&#xff08;访问者&#xff09;

同时还有六大原则&#xff1a;

同时&#xff0c;我们需要了解到&#xff0c;设计模式的6个基本原则&#xff0c;这也算是本题的设计理念&#xff1a;

  • 1、单一职责原则&#xff08;Single Responsibility Principle&#xff09;
  • 2、里氏代换原则&#xff08;Liskov Substitution Principle&#xff09;
  • 3、依赖倒转原则&#xff08;Dependence Inversion Principle&#xff09;
  • 4、接口隔离原则&#xff08;Interface Segregation Principle&#xff09;
  • 5、迪米特法则&#xff0c;又称最少知道原则&#xff08;Demeter Principle&#xff09;
  • 6、开闭原则&#xff08;Open Close Principle&#xff09;

更多详细的解释可以看 如何通俗理解设计模式及其思想

然而面试肯定不是只有通俗理解&#xff0c;它需要一些项目中理解得更深层次的东西&#xff0c;比如说单例日志类等一系列应用&#xff0c;还有自己的想法&#xff0c;我在答完这个问题后&#xff0c;可能是因为答得很笼统&#xff0c;看起来都在点上&#xff0c;但都被否定了。

HTTP中四次挥手的等待时间

TCP的四次挥手之后&#xff0c;主动方为什么等待2倍最大生命周期&#xff08;MSL Maximum Segment Lifetime&#xff09;&#xff0c;这个问题我感觉大致达到为什么要有等待时间就OK了&#xff0c;具体的背也没背会。

这最主要是因为两个理由&#xff1a;

1、为了保证客户端发送的最后一个ACK报文段能够到达服务器。 因为这个ACK有可能丢失&#xff0c;从而导致处在LAST-ACK状态的服务器收不到对FIN-ACK的确认报文。服务器会超时重传这个FIN-ACK&#xff0c;接着客户端再重传一次确认&#xff0c;重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL&#xff0c;而是在发送完ACK之后直接释放关闭&#xff0c;一但这个ACK丢失的话&#xff0c;服务器就无法正常的进入关闭连接状态。

2、还可以防止已失效的报文段。 客户端在发送最后一个ACK之后&#xff0c;再经过经过2MSL&#xff0c;就可以使本链接持续时间内所产生的所有报文段都从网络中消失。从保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

注意&#xff1a;在服务器发送了FIN-ACK之后&#xff0c;会立即启动超时重传计时器。客户端在发送最后一个ACK之后会立即启动时间等待计时器。

numpy和pandas数组有什么区别

百度不到这个题目的答案&#xff0c;可想而知我当时是多么的懵逼。我大概就知道python列表和numpy数组的一个区别&#xff0c;之前 numpy总结与思维导图 一文中大概写了点区别。但pandas和numpy这个问题属实没想明白。当时答得是pandas花费更多时间在表结构可视化上&#xff0c;所以可能会比numpy慢&#xff1f;不知道&#xff0c;如果有大佬懂可以留言或者私信我&#xff0c;谢谢。

restful盛行最本质的原因是什么&#xff1f;

我开始想谈一大堆restful的设计原则&#xff1a;

  1. 每一个URI代表一种资源;
  2. 同一种资源有多种表现形式(xml/json);
  3. 所有的操作都是无状态的。
  4. 规范统一接口。
  5. 返回一致的数据格式。
  6. 可缓存(客户端可以缓存响应的内容)。

然而真正火起来的原因&#xff0c;我没有定论。说的时候也没有上面那样标准&#xff0c;有点想到什么说什么&#xff0c;这个是我的失误&#xff0c;因为今年面试太少&#xff0c;我基本毫无准备就想凭借自己的经验答这类文字题&#xff0c;事实表明是不行的。

面试官点醒&#xff0c;其实是上面第三点的三个字&#xff1a;无状态。 然后根据这个还能扯到微服务和分布式。。。于是我现在写这篇博文的时候&#xff0c;顺带去查到了这篇 深入RESTful无状态原则

因为无状态原则的特性&#xff0c;让RESTful在分布式系统中得到了广泛的应用&#xff0c;它改善了分布式系统的可见性、可靠性以及可伸缩性&#xff0c;同时有效的降低了Client与Server之间的交互延迟。无状态的请求有利于实现负载均衡&#xff0c;在分布式web系统下&#xff0c;有多个可的Server&#xff0c;每个Server都可以处理Client发送的请求。有状态的请求的状态信息只保存在第一次接收请求的Server上&#xff0c;所以后来同一个Client的请求都只能由这台Server来处理&#xff0c;Server无法自由调度请求。无状态请求则完全没有这个限制。其次&#xff0c;无状态请求有较强的容错性和可伸缩性。如果一台服务器宕机&#xff0c;无状态请求可以透明地交由另一台可用Server来处理&#xff0c;而有状态的请求则会因为存储请求状态信息的Server宕机而承担状态丢失的风险。Restful风格的无状态约束要求Server不保存请求状态&#xff0c;如果确实需要维持用户状态&#xff0c;也应由Client负责。


说说你接近两年&#xff0c;做过你比较得意的或者理解得较深的东西

在问这个问题前&#xff0c;还问了一些我项目中出现过的流程还要算法原理&#xff0c;因为我之前做过一点nlp&#xff0c;不知道是失望还是什么原因&#xff0c;问出了这个问题&#xff0c;然后我突然发现我连这个问题都已经回答不了了&#xff0c;没有什么成就&#xff0c;况且那个时候心态已经崩了&#xff0c;我也忘了当时讲的什么&#xff0c;现在也不愿意去回想这个问题&#xff0c;选择性失忆吧。最后我跟面试官坦白了近期的一些焦虑以及我能想到的方向&#xff0c;但这种东西旁人是很难提一些指导性意见的&#xff0c;况且我技术并不过关&#xff0c;不置可否&#xff0c;落荒。。。

结尾

隔了两个多礼拜回来看当时写的东西&#xff0c;本来是可能要见底的一篇私人笔记&#xff0c;是我最后几次之一&#xff0c;记得还清楚。如果现在我选择做测试&#xff0c;那么就永远不会公开了&#xff0c;但很庆幸&#xff0c;我竟然还能做开发&#xff0c;就我这种半桶水&#xff0c;而且很多东西已忘光&#xff0c;又没有准备面试题&#xff0c;近期还被血虐到人有点颓。。。现在准备重新捡起了&#xff0c;很开心还能用一篇博文总结我的失败&#xff0c;我会从这些失败中醒来&#xff0c;继续之前未完的道路&#xff0c;谢谢。


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
sj_Ford
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有