【本周问题总结--陆续补充】

确实感觉面试的时候,数据结构和数据库这块的被问到的最多。。涉及到代码方面可能会比较关注时间复杂度掌握情况,看你代码能不能优化,是不是只会暴力破解,数据库的优化,出现问题如何解决等等

01.如何判断链表中是否有环

        ①穷举遍历:从头节点开始,依次遍历单链表中的每一个节点。每遍历到一个新节点,将新节点和此前节点进行比较,若已经存在则说明已被遍历过,链表有环。

        ②快慢指针:创建两个指针,同时指向链表的头节点。然后开始一个大循环,在循环体中指针1每次移动一个节点,指针2每次移动两个节点。(可以类比环形跑道,一个快一个慢在同一起跑线开始后面跑的快的一定会再次超过跑的慢的,假设从链表头节点到入环点的距离是D,链表的环长是S,那么循环会进行S次)

02.如何找出有环链表的入环点

        这个哥哥讲的挺好的,放个链接

如何判断链表有环以及求入环节点 - 简书 (jianshu.com)

03.数据库方面了解程度

        我比较了解数据库(先说一些基本理解),包括数据库的类型可以分为关系型数据库和非关系型数据库,常用的数据库管理系统有MySQL,MongoDB等等,数据库的基本操作有CRUB:创建、读取、.....,我曾经参与过一个数据库设计与优化的项目。在这个项目中,我负责设计数据库,优化查询语句,调整数据库配置等等,同时我还实际应用了一些数据库管理工具来监控和维护数据库。(自己要扩展说出来这些东西,避免面试官深问的时候说不出来东西。。)

04.如果数据库中进行多线程出现数据安全问题如何解决(锁)

  1. 使用事务:在数据库中使用事务可以确保一系列操作要么全部执行成功,要么全部失败,从而保持数据的一致性。在多线程环境下,通过合理地使用事务可以避免数据异常和冲突。

  2. 加锁:在数据库中使用锁机制来确保在某个线程访问数据时,其他线程无法对其进行修改,从而避免数据的并发修改问题。需要根据具体情况选择合适的锁机制,如行级锁、表级锁等。

  3. 乐观锁和悲观锁:乐观锁是一种乐观估计并发操作不会发生冲突的方式,通常通过版本号或时间戳进行判断;悲观锁则是一种悲观估计并发操作会发生冲突的方式,通常通过加锁实现。

  4. 合理的并发控制策略:通过合理的并发控制策略,如控制并发线程的访问频率、引入队列机制等来减少并发访问导致的数据安全问题。

  5. 数据库设计优化:通过合理的数据库设计和索引设计来降低数据库操作的复杂度,减少并发操作的影响。

  6. 异常处理:在多线程操作中,需要合理地处理并发操作可能引发的异常情况,确保数据的完整性和一致性。

05.二叉树的时间复杂度

数据结构:常见算法的时间复杂度汇总_数据结构各种算法的时间复杂度-CSDN博客

延申:其他数据类型的应用场景

1.链表:需要频繁插入删除的场景。在操作系统中,链表常用于管理内存(分配与回收)。例如,当系统需要分配或释放内存块时,可以使用链表来跟踪哪些内存块是可用的,哪些已经被用。此外,进程调度、文件系统管理等也常涉及链表的使用。

2.数组:数据量小,不会频繁更改的场景。存储一个班级的所有学生的分数,或者存储一个游戏的所有角色的属性。

3.栈:需要实现后进先出,例如实现浏览器的后退功能,计算机中进行算术表达式的计算,例如实现函数调用、括号匹配等场景。

4.队列:需要实现先入先出。实现任务调度、缓冲。如车站售票口买票的队伍,排在前面的人先买到票离开队伍,后来的人则加入队伍的末尾等候买票。队列还可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等

5.哈希表:哈希表适用于那种查找性能要求高,数据元素之间无逻辑关系要求。哈希表的应用场景很多,当然也有很多问题要考虑,比如哈希冲突的问题,如果处理的不好会浪费大量的时间,导致应用崩溃。

6.树和图:最重要的两个结构。目标分解和层序关系等都是相当于数据结构中的树的应用,还可以实现文件系统、决策树等场景。图是描述多对多事物之间关系的,当你询问GPS时,GPS系统为什么能给指出一条两地之间的路线,这就是利用了图的存储和遍历运算,求出最优解。在现实生活中很多复杂的关系都可以用图来描述并利用图去解决一些问题,例如社交网络、路由协议。

7.堆:堆是一类特殊的树形数据结构,通常用数组来实现。它主要用于优先队列等场景,具有高效的插入和删除操作。堆分为最大堆和最小堆两种类型。

06.服务器端的安全有哪些层面,为我画一棵树

  1. 网络安全:包括防火墙、网络访问控制列表、入侵检测系统(IDS)和入侵防御系统(IPS)等网络安全设备,用于保护服务器免受网络攻击。

  2. 操作系统安全:包括操作系统的安全配置、及时安装操作系统的安全更新补丁、限制不必要的服务、使用安全的账户和访问控制策略等来保护操作系统安全。

  3. 身份验证与授权:采用安全的身份验证机制,如多因素身份验证、密钥管理等,以及合理的授权策略,确保只有授权的用户可以访问服务器资源。

  4. 应用程序安全:确保服务器上运行的应用程序没有安全漏洞,采用安全的编程实践,对输入进行正确的验证和过滤,以及进行安全的错误处理。

  5. 数据安全:使用加密技术保护数据的传输和存储安全,采用数据备份和恢复策略,以及访问控制策略来确保数据安全。

  6. 日志和监控:建立完善的日志系统,对服务器的各种操作和事件进行监控和记录,及时发现异常行为并采取相应的应对措施。

07.SQL注入、DDOS攻击、泛洪攻击是什么

08.翻转数组如何实现

09.关于java和python的区别

  1. 语法:Java是一种静态类型的编程语言,需要在编写代码时声明变量的数据类型,并且需要使用大括号来表示代码块。而Python是一种动态类型的编程语言,不需要声明变量的数据类型,并且使用缩进来表示代码块。

  2. 性能:Java通常比Python执行更快,这是由于Java是一种编译型语言,代码在运行之前会被编译成字节码,然后在Java虚拟机(JVM)上执行;而Python是一种解释型语言,代码在运行时逐行被解释器解释执行。编译型语言通常有更高的执行效率,因为字节码已经被提前优化和编译成机器码,而解释型语言则需要动态地解释执行。

  3. 应用领域:Java常用于企业级应用开发、Android应用开发、大型系统开发等;Python常用于数据科学、人工智能、Web开发等领域。

10.对业务的了解程度(之前的实习经历)

11.怎么高效的创建SQL表

  1. 规划数据模型:在创建表之前,首先需要对数据模型进行规划。考虑需要存储的数据及其关系,设计出符合业务需求的数据模型。

  2. 选择合适的数据类型:根据数据模型的规划,选择合适的数据类型来存储数据,尽量避免使用过大或过小的数据类型,以节省存储空间。

  3. 设计合适的索引:根据数据的查询需求,设计合适的索引来提高查询效率。通常可以为经常用于查询、连接或排序的字段创建索引。

  4. 使用约束:使用合适的约束来保证数据的完整性,比如主键约束、外键约束、唯一约束、非空约束等,以防止数据出现不符合预期的情况。

  5. 考虑性能优化:在创建表的过程中,可以考虑一些性能优化的策略,比如合理分配数据文件和日志文件,选择合适的存储引擎类型,以及预估数据量大小来调整表结构等。

  6. 使用DDL语句创建表:最后,使用SQL的数据定义语言(DDL)中的CREATE TABLE语句来创建表,确保表的结构和约束符合设计需求。

12.什么是好的键值

  1. 唯一性:键值应该是唯一的,这样可以确保每个键都对应着唯一的数值或对象,避免出现混乱或错误的情况。

  2. 代表性:键值应当能够清晰、准确地代表对应的数据或对象,以便于快速识别和定位。

  3. 不易变性:键值应当尽量是不易变的,避免在使用过程中频繁改变,这样可以确保使用键值来检索数据时不会出现意外的情况。

  4. 易于理解:键值应当具有良好的可读性和易懂性,这样不仅有助于开发人员理解和维护数据,也方便了解数据的含义。

  5. 适度长度:键值的长度应当适度,既不宜过短导致信息不足,也不宜过长导致冗余和复杂性增加。

13.python web的开发经验有什么

  1. Web 框架的使用经验:介绍你在 Python Web 开发中使用过的框架,比如 Flask、Django、FastAPI 等,以及你对这些框架的理解和使用经验。可以举例说明你如何利用这些框架构建 Web 应用。

  2. 数据库操作经验:谈谈你在 Python Web 开发中使用数据库的经验,比如使用 SQLAlchemy 进行数据库操作、ORM 映射、数据迁移等经验。

  3. 前端开发经验:如果有前端开发经验,可以介绍你在 Python Web 项目中使用过的前端技术和工具,比如 JavaScript、Vue.js、React 等,以及与后端的数据交互经验。

  4. 接口开发经验:描述你在 Python Web 开发中接口的设计与实现经验,比如 RESTful API 的设计、请求参数验证、异常处理等方面的经验。

  5. 测试与部署经验:谈谈你在 Python Web 开发中的测试方法和部署经验,比如单元测试、集成测试、持续集成等方面的实践经验。

  6. 项目经验:如果有相关项目经验,可以结合具体项目,描述你在项目中的角色和贡献,以及遇到的挑战和解决方案。

14.在Java中除了thread还有什么能实现多线程(这里是因为我说了thread)

        继承Thread类:创建一个类并继承Thread类,重写run()方法,在run()方法中定义线程需要执行的任务,然后创建该类的实例并调用start()方法启动线程。

        Runnable接口:创建一个类实现Runnable接口,实现run()方法,在run()方法中定义线程需要执行的任务,然后创建Thread对象,将实现了Runnable接口的类的实例作为参数传递给Thread的构造函数,并调用start()方法启动线程。

15.fastapi和mysql接口存储

在使用FastAPI和MySQL搭建接口服务时,可以通过FastAPI提供的路由和请求处理功能来实现与MySQL数据库的交互。比如通过FastAPI创建了两个接口,一个用于创建数据,一个用于获取数据。在接口的实现中,通过pymysql库来连接MySQL数据库,并执行相应的数据库操作。

代码题:

约瑟夫环

可以使用循环链表或者数组来模拟这个过程。下面是使用数组的解决思路:

  1. 创建一个长度为 n 的数组,用来表示 n 个人的报数情况,初始值全部设为 1,表示这些人都还在圈内。

  2. 设置一个指针变量当前位置 cur,初始值为 0,表示从第一个人开始报数。

  3. 在循环中模拟报数和出列的过程,直到所有人都出列为止。在循环中,每次移动指针 cur 到下一个报数的人,当报数达到 m 时,将该人标记为出列状态(可以将对应数组元素置为 0),然后继续下一个人的报数。

  4. 指针 cur 每次移动 m 步,直到所有人都出列。

令矩阵行列对角线之和相等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值