当前位置: 首页 > article >正文

面试被问烂的20道编程基础题,你必须全会,不然别去面试

文章目录前言一、Python基础篇6道1. Python中list和tuple有什么区别2. Python 3.7之后普通dict已经有序了那OrderedDict还有存在的必要吗3. Python中的深拷贝和浅拷贝有什么区别4. Python中的*args和**kwargs是什么意思5. Python中的生成器是什么它有什么优点6. Python中的装饰器是什么它有什么作用二、数据结构基础篇5道7. 什么是数组它有什么优缺点8. 什么是链表它和数组有什么区别9. 什么是栈和队列它们有什么区别10. 什么是哈希表它的工作原理是什么11. 什么是二叉树什么是二叉搜索树三、算法基础篇3道12. 什么是递归递归有什么优缺点13. 什么是动态规划它的核心思想是什么14. 什么是排序算法常见的排序算法有哪些它们的时间复杂度是多少四、网络基础篇2道15. TCP的三次握手和四次挥手是什么为什么是三次不是两次16. HTTP和HTTPS有什么区别五、操作系统基础篇2道17. 进程和线程有什么区别18. 什么是死锁死锁产生的条件是什么如何避免死锁六、数据库基础篇2道19. 什么是事务事务的ACID特性是什么20. 什么是索引索引有什么优缺点总结P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。前言兄弟们先问个扎心的问题你最近面试的时候是不是十场有八场都会被问到一些看似简单到离谱的编程基础题结果你要么脑子一片空白半天憋不出一句完整的话要么张嘴就来结果答得漏洞百出被面试官连环追问当场哑火恨不得找个地缝钻进去我在AI行业摸爬滚打了22年面过的候选人没有一千也有八百最近这两年尤其是2026年这种情况见得太多了。很多小伙子简历写得天花乱坠什么精通大模型开发、“熟练掌握智能体架构”、“参与过千万级并发系统”结果一被问到Python中list和tuple有什么区别这种小学一年级的问题直接就卡壳了。更离谱的是有个小伙子面试AI算法工程师说自己用PyTorch写过十几个大模型结果我问他什么是递归他想了半天说递归就是…就是自己调用自己吧我再问那递归有什么缺点他直接懵了说“缺点递归还有缺点我一直觉得递归挺好用的啊。”兄弟们这不是个例。现在很多人都在追热点什么火就学什么大模型火就学大模型智能体火就学智能体结果把最基础的编程知识忘得一干二净。殊不知面试的时候面试官最看重的恰恰就是你的基础功底。因为热点技术可以学框架可以换但是基础不牢地动山摇。今天我就把2026年面试被问烂了的20道编程基础题整理出来每一道都给你讲得明明白白。如果你连这些题都不会我劝你还是别去面试了去了也是浪费时间浪费车费。一、Python基础篇6道1. Python中list和tuple有什么区别这道题简直是面试必考题没有之一。我敢说只要你面试Python相关的岗位不管是后端、前端、测试还是AI算法100%会被问到这道题。很多人只会说list是可变的tuple是不可变的。然后就没了。兄弟这样回答只能给你30分剩下的70分你全丢了。我给你一个满分回答list和tuple的核心区别有以下5点可变性list是可变对象支持增删改查操作tuple是不可变对象一旦创建就不能修改。这就好比list是一个笔记本你可以在上面写字、擦字、改字而tuple是一本书一旦印刷出来你就不能修改上面的内容了。语法list用方括号[]表示tuple用圆括号()表示。注意当tuple只有一个元素时需要在后面加一个逗号比如(1,)否则Python会把它当成一个普通的变量。性能tuple的性能比list好。因为tuple是不可变的Python可以对它进行很多优化比如缓存、预分配内存等。所以如果你有一些不需要修改的数据优先使用tuple这样可以提高程序的运行速度。哈希性tuple是可哈希的也就是说它可以作为字典的键也可以放入集合中而list是不可哈希的不能作为字典的键也不能放入集合中。这是因为哈希值是根据对象的内容计算出来的如果对象可变哈希值也会变这样就会导致字典和集合出现混乱。使用场景list适合存储需要动态修改的数据比如用户列表、商品列表等tuple适合存储不需要修改的数据比如坐标、颜色、配置信息等。2. Python 3.7之后普通dict已经有序了那OrderedDict还有存在的必要吗这道题是最近两年才火起来的因为Python 3.7确实把普通dict改成了有序的。很多人就觉得OrderedDict没用了可以淘汰了。兄弟如果你这么想那就大错特错了。OrderedDict不仅没有被淘汰反而在很多场景下依然是必不可少的。我给你讲清楚首先Python 3.7的普通dict只是插入有序也就是说它会按照你插入键值对的顺序来保存。但是它没有提供任何专门的方法来操作这个顺序。而OrderedDict提供了很多普通dict没有的方法比如move_to_end(key, lastTrue)将指定的键移动到字典的末尾或者开头popitem(lastTrue)删除并返回字典末尾或者开头的键值对这些方法在实现LRU缓存、FIFO队列等数据结构的时候非常有用。比如你要实现一个LRU缓存当缓存满了的时候需要删除最近最少使用的元素。如果用普通dict你需要自己维护一个链表来记录访问顺序而用OrderedDict只需要一行代码move_to_end(key)就可以把最近访问的元素移到末尾然后用popitem(lastFalse)删除最前面的元素非常方便。另外OrderedDict的相等性判断也和普通dict不同。两个OrderedDict只有当它们的键值对顺序完全相同时才会被认为是相等的而两个普通dict只要键值对相同不管顺序如何都会被认为是相等的。所以OrderedDict不仅有存在的必要而且在很多场景下比普通dict更适合。3. Python中的深拷贝和浅拷贝有什么区别这道题也是面试高频题而且很容易搞混。很多人只会说浅拷贝只拷贝第一层深拷贝拷贝所有层。这样回答太笼统了面试官肯定会继续追问。我给你用一个通俗的例子讲清楚假设你有一个列表a [1, 2, [3, 4]]。这个列表就像一个文件夹里面有两个文件1和2还有一个子文件夹[3, 4]子文件夹里面又有两个文件3和4。浅拷贝就像你复制了这个文件夹得到了一个新的文件夹b。新文件夹里面的文件1和2是原文件的副本但是子文件夹[3, 4]只是原文件夹的一个快捷方式。也就是说如果你修改b[0]不会影响a[0]但是如果你修改b[2][0]就会影响a[2][0]因为它们指向的是同一个子文件夹。深拷贝就像你不仅复制了这个文件夹还复制了里面所有的子文件夹和文件得到了一个完全独立的新文件夹c。不管你修改c里面的任何内容都不会影响原来的文件夹a。在Python中实现浅拷贝的方法有使用切片操作b a[:]使用工厂函数b list(a)使用copy模块的copy函数import copy; b copy.copy(a)实现深拷贝的方法只有一个使用copy模块的deepcopy函数import copy; c copy.deepcopy(a)需要注意的是深拷贝比浅拷贝慢很多因为它需要递归地拷贝所有的对象。所以如果你的数据结构很简单没有嵌套的可变对象使用浅拷贝就足够了只有当你的数据结构中有嵌套的可变对象并且你需要完全独立的副本时才使用深拷贝。4. Python中的*args和**kwargs是什么意思这道题也是基础中的基础但是很多人还是搞不清楚。其实很简单我一句话就能给你讲明白*args用来接收任意数量的位置参数它会把这些参数打包成一个元组**kwargs用来接收任意数量的关键字参数它会把这些参数打包成一个字典举个例子deffunc(*args,**kwargs):print(args)print(kwargs)func(1,2,3,name张三,age18)输出结果(1, 2, 3) {name: 张三, age: 18}*args和**kwargs的使用场景主要有两个当你不知道函数会接收多少个参数的时候可以用它们来接收任意数量的参数当你需要把一个列表或者字典作为参数传递给函数的时候可以用它们来解包比如defadd(a,b):returnab nums[1,2]print(add(*nums))# 输出3params{a:3,b:4}print(add(**params))# 输出7需要注意的是*args必须放在**kwargs前面否则会报错。5. Python中的生成器是什么它有什么优点生成器是Python中一个非常重要的概念也是面试常考题。很多人觉得生成器很神秘其实一点都不神秘。生成器就是一个特殊的迭代器它不需要一次性把所有的数据都加载到内存中而是在迭代的时候才生成数据。这样可以大大节省内存空间尤其是当你需要处理大量数据的时候。创建生成器有两种方法使用生成器表达式把列表推导式的方括号改成圆括号就可以了gen(xforxinrange(1000000))使用yield关键字在函数中使用yield关键字这个函数就变成了一个生成器函数deffib(n):a,b0,1for_inrange(n):yieldb a,bb,ab生成器的优点主要有两个节省内存生成器不需要一次性把所有的数据都加载到内存中而是在需要的时候才生成数据。比如上面的例子如果你用列表推导式创建一个包含100万个元素的列表会占用大量的内存而用生成器表达式几乎不占用任何内存。惰性计算生成器只有在迭代的时候才会计算下一个值。这样可以避免不必要的计算提高程序的运行效率。需要注意的是生成器只能迭代一次。迭代完之后生成器就空了不能再迭代了。6. Python中的装饰器是什么它有什么作用装饰器是Python中一个非常强大的特性也是面试必考题。很多人觉得装饰器很难其实只要你理解了函数是一等公民这个概念装饰器就非常简单了。在Python中函数是一等公民也就是说函数可以作为参数传递给另一个函数函数可以作为返回值从另一个函数返回函数可以被赋值给一个变量装饰器本质上就是一个函数它接收一个函数作为参数然后返回一个新的函数。新的函数会在不修改原函数代码的情况下给原函数添加一些额外的功能。举个最简单的例子我们要给一个函数添加计时功能importtimedeftimer(func):defwrapper(*args,**kwargs):starttime.time()resultfunc(*args,**kwargs)endtime.time()print(f{func.__name__}函数执行时间{end-start}秒)returnresultreturnwrappertimerdefadd(a,b):time.sleep(1)returnabprint(add(1,2))输出结果add函数执行时间1.000123秒 3这里的timer就是一个装饰器它等价于add timer(add)。装饰器的作用非常广泛比如日志记录性能统计权限验证缓存重试机制等等。可以说装饰器是Python中实现面向切面编程(AOP)的最佳方式。二、数据结构基础篇5道7. 什么是数组它有什么优缺点数组是最基本的数据结构之一几乎所有的编程语言都支持数组。数组是一种连续存储的数据结构它在内存中占用一块连续的空间用来存储相同类型的数据。数组中的每个元素都有一个唯一的索引通过索引可以快速访问数组中的任意元素。数组的优点随机访问速度快通过索引可以在O(1)时间内访问数组中的任意元素。这是数组最大的优点也是很多其他数据结构无法比拟的。内存利用率高数组是连续存储的没有指针开销内存利用率很高。数组的缺点插入和删除操作慢因为数组是连续存储的所以在数组中间插入或者删除元素的时候需要移动后面的所有元素时间复杂度是O(n)。大小固定大多数编程语言中的数组大小都是固定的一旦创建就不能改变。如果数组满了就需要创建一个更大的数组然后把原来的元素复制过去这个过程非常耗时。只能存储相同类型的数据数组只能存储相同类型的数据不能存储不同类型的数据。8. 什么是链表它和数组有什么区别链表也是一种非常基本的数据结构它和数组正好相反。链表是一种非连续存储的数据结构它由一个个节点组成每个节点包含数据和一个指向下一个节点的指针。链表中的节点在内存中不是连续存储的而是通过指针连接在一起的。链表和数组的区别主要有以下几点特性数组链表存储方式连续存储非连续存储随机访问O(1)O(n)插入和删除O(n)O(1)已知前驱节点大小固定动态内存利用率高低有指针开销举个通俗的例子数组就像一排连在一起的房子每个房子都有一个门牌号你可以通过门牌号直接找到对应的房子而链表就像一串珍珠每个珍珠都用线连在一起你要找到第n个珍珠必须从第一个珍珠开始一个一个地数过去。链表的优点是插入和删除操作快大小动态缺点是随机访问慢内存利用率低。9. 什么是栈和队列它们有什么区别栈和队列都是操作受限的线性表它们的区别在于操作的顺序不同。栈是一种后进先出(LIFO)的数据结构。也就是说最后进入栈的元素最先被取出。栈的操作主要有两个入栈(push)和出栈(pop)。入栈是把元素放到栈顶出栈是把栈顶的元素取出来。栈就像一个羽毛球筒你把羽毛球一个一个地放进去最后放进去的那个最先被拿出来。队列是一种先进先出(FIFO)的数据结构。也就是说最先进入队列的元素最先被取出。队列的操作主要有两个入队(enqueue)和出队(dequeue)。入队是把元素放到队尾出队是把队头的元素取出来。队列就像排队买东西先来的人先买后来的人后买。栈和队列的应用场景非常广泛栈的应用函数调用栈、表达式求值、括号匹配、深度优先搜索(DFS)等队列的应用消息队列、任务调度、广度优先搜索(BFS)等10. 什么是哈希表它的工作原理是什么哈希表也叫散列表是一种非常重要的数据结构几乎所有的编程语言都内置了哈希表的实现比如Python中的dict。哈希表的核心思想是通过一个哈希函数将键(key)映射到一个数组的索引然后将值(value)存储在这个索引对应的位置。这样当我们需要查找一个键的时候只需要用哈希函数计算出它的索引然后直接访问数组中对应的位置就可以了时间复杂度是O(1)。哈希表的工作原理当我们要插入一个键值对时首先用哈希函数计算出键的哈希值然后用哈希值对数组的长度取模得到数组的索引最后将值存储在这个索引对应的位置但是不同的键可能会计算出相同的哈希值这就叫做哈希冲突。解决哈希冲突的方法主要有两种链地址法将哈希值相同的元素存储在一个链表中。当发生哈希冲突时就将新元素添加到链表的末尾。Python中的dict就是用这种方法解决哈希冲突的。开放地址法当发生哈希冲突时就按照一定的规则寻找下一个空的位置。常见的开放地址法有线性探测、二次探测和双重哈希。哈希表的优点是查找、插入和删除操作都非常快平均时间复杂度是O(1)缺点是哈希冲突会影响性能而且哈希表是无序的。11. 什么是二叉树什么是二叉搜索树二叉树是一种非常重要的树形数据结构它的每个节点最多有两个子节点分别叫做左子节点和右子节点。二叉树有很多种特殊的类型比如满二叉树、完全二叉树、二叉搜索树、平衡二叉树、红黑树等等。其中二叉搜索树是面试中最常被问到的。二叉搜索树(BST)也叫二叉排序树它具有以下性质左子树上所有节点的值都小于根节点的值右子树上所有节点的值都大于根节点的值左子树和右子树也都是二叉搜索树二叉搜索树的优点是查找、插入和删除操作都比较快平均时间复杂度是O(log n)。但是如果二叉搜索树不平衡比如变成了一个链表那么时间复杂度就会退化为O(n)。为了解决这个问题人们发明了平衡二叉树比如AVL树和红黑树。它们通过旋转操作来保持树的平衡从而保证了最坏情况下的时间复杂度也是O(log n)。三、算法基础篇3道12. 什么是递归递归有什么优缺点递归是一种非常重要的算法思想它是指一个函数直接或者间接调用自己。递归的核心思想是将一个大问题分解成若干个规模较小的子问题这些子问题和原问题具有相同的结构然后通过解决这些子问题来解决原问题。递归必须满足两个条件基线条件也叫终止条件当问题分解到一定程度时就可以直接解决不需要再递归了。递归条件将大问题分解成小问题的条件。举个最简单的例子计算阶乘deffactorial(n):# 基线条件ifn0orn1:return1# 递归条件returnn*factorial(n-1)递归的优点代码简洁、清晰容易理解很多问题天然适合用递归解决比如树的遍历、图的搜索、分治算法等递归的缺点栈溢出风险递归调用会占用函数调用栈的空间如果递归深度太大就会导致栈溢出。比如Python默认的递归深度是1000如果超过这个深度就会抛出RecursionError异常。重复计算很多递归算法会存在重复计算的问题比如斐波那契数列的递归实现时间复杂度是O(2^n)非常慢。性能开销函数调用会有一定的性能开销递归调用的次数越多性能开销越大。为了解决递归的缺点我们可以用迭代来代替递归或者用记忆化搜索来避免重复计算。13. 什么是动态规划它的核心思想是什么动态规划是一种非常重要的算法思想也是面试中的难点。很多人觉得动态规划很难其实只要你掌握了它的核心思想就会发现动态规划其实很简单。动态规划的核心思想是将一个大问题分解成若干个规模较小的子问题先解决这些子问题然后将子问题的解存储起来避免重复计算最后通过子问题的解来得到原问题的解。动态规划和递归的区别在于递归是自顶向下的从原问题开始分解成子问题然后递归解决子问题而动态规划是自底向上的从最小的子问题开始逐步解决更大的问题直到解决原问题。动态规划问题一般可以分为以下几个步骤定义状态确定dp数组的含义dp[i]表示什么确定状态转移方程找出dp[i]和dp[i-1]、dp[i-2]等之间的关系确定初始条件确定dp[0]、dp[1]等初始值确定遍历顺序确定是从前往后遍历还是从后往前遍历举个最简单的例子斐波那契数列的动态规划实现deffib(n):ifn0orn1:returnn# 定义状态dp[i]表示第i个斐波那契数dp[0]*(n1)# 初始条件dp[0]0dp[1]1# 状态转移方程foriinrange(2,n1):dp[i]dp[i-1]dp[i-2]returndp[n]这个实现的时间复杂度是O(n)空间复杂度是O(n)比递归实现快多了。14. 什么是排序算法常见的排序算法有哪些它们的时间复杂度是多少排序算法是最基础的算法之一也是面试必考题。面试官经常会让你手写一个排序算法或者问你各种排序算法的时间复杂度和适用场景。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序、计数排序、桶排序、基数排序等。我给你整理了一个表格包含了常见排序算法的时间复杂度、空间复杂度和稳定性排序算法平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(n)O(1)稳定选择排序O(n²)O(n²)O(n²)O(1)不稳定插入排序O(n²)O(n²)O(n)O(1)稳定快速排序O(n log n)O(n²)O(n log n)O(log n)不稳定归并排序O(n log n)O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(n log n)O(1)不稳定计数排序O(n k)O(n k)O(n k)O(k)稳定桶排序O(n k)O(n²)O(n)O(n k)稳定基数排序O(d * (n k))O(d * (n k))O(d * (n k))O(n k)稳定其中k是数据的范围d是数据的位数。在实际应用中最常用的排序算法是快速排序因为它的平均时间复杂度是O(n log n)而且常数因子很小性能非常好。但是快速排序的最坏时间复杂度是O(n²)不过这种情况很少发生。四、网络基础篇2道15. TCP的三次握手和四次挥手是什么为什么是三次不是两次这道题简直是网络基础面试的天花板没有之一。只要你面试和网络相关的岗位100%会被问到这道题。很多人背了无数遍三次握手和四次挥手的过程但是面试官一问为什么是三次不是两次就支支吾吾答不上来。我先给你讲清楚三次握手的过程TCP是一种面向连接的、可靠的传输层协议。在传输数据之前客户端和服务器必须先建立连接。建立连接的过程就是三次握手第一次握手客户端向服务器发送一个SYN包请求建立连接。此时客户端进入SYN_SENT状态。第二次握手服务器收到SYN包后向客户端发送一个SYNACK包确认客户端的请求同时也请求建立连接。此时服务器进入SYN_RCVD状态。第三次握手客户端收到SYNACK包后向服务器发送一个ACK包确认服务器的请求。此时客户端和服务器都进入ESTABLISHED状态连接建立成功。为什么是三次不是两次很多人会说因为要确认双方的发送和接收能力都正常。这个回答是对的但是不够全面。我给你一个更深入的回答如果只有两次握手那么就会出现这样一种情况客户端发送了一个SYN包但是这个包在网络中滞留了没有及时到达服务器。客户端以为这个包丢失了于是又重新发送了一个SYN包。服务器收到第二个SYN包后建立了连接传输完数据后关闭了连接。但是过了一段时间第一个SYN包终于到达了服务器。服务器以为客户端又要建立连接于是向客户端发送一个SYNACK包进入ESTABLISHED状态。但是客户端根本没有请求建立连接所以会忽略这个ACK包。而服务器却一直等待客户端发送数据这样就会浪费服务器的资源。三次握手就可以解决这个问题。因为在第三次握手的时候客户端会向服务器发送一个ACK包。如果服务器没有收到这个ACK包就会知道这个连接是无效的从而关闭连接不会浪费资源。接下来讲四次挥手的过程当数据传输完成后客户端和服务器需要关闭连接。关闭连接的过程就是四次挥手第一次挥手客户端向服务器发送一个FIN包请求关闭连接。此时客户端进入FIN_WAIT_1状态。第二次挥手服务器收到FIN包后向客户端发送一个ACK包确认客户端的请求。此时服务器进入CLOSE_WAIT状态客户端进入FIN_WAIT_2状态。第三次挥手服务器发送完所有数据后向客户端发送一个FIN包请求关闭连接。此时服务器进入LAST_ACK状态。第四次挥手客户端收到FIN包后向服务器发送一个ACK包确认服务器的请求。此时客户端进入TIME_WAIT状态等待2MSL最长报文段寿命后进入CLOSED状态。服务器收到ACK包后也进入CLOSED状态。为什么关闭连接需要四次挥手而建立连接只需要三次握手因为建立连接的时候服务器的SYN和ACK可以放在同一个包中发送而关闭连接的时候服务器的ACK和FIN不能放在同一个包中发送因为服务器可能还有数据没有发送完。所以服务器需要先发送一个ACK包确认客户端的关闭请求然后等所有数据都发送完之后再发送一个FIN包请求关闭连接。16. HTTP和HTTPS有什么区别这道题也是网络基础面试的必考题尤其是现在几乎所有的网站都使用HTTPS了。HTTP和HTTPS的核心区别主要有以下几点安全性HTTP是明文传输的数据在传输过程中容易被窃听、篡改和伪造而HTTPS是在HTTP的基础上加入了SSL/TLS协议对数据进行了加密传输保证了数据的安全性。端口号HTTP默认使用80端口HTTPS默认使用443端口。性能HTTPS的性能比HTTP差因为加密和解密需要消耗一定的CPU资源。不过现在随着硬件性能的提升和SSL/TLS协议的优化这个差距已经越来越小了。证书HTTPS需要申请SSL证书证书一般需要向CA机构购买而HTTP不需要证书。HTTPS的工作原理客户端向服务器发送一个HTTPS请求服务器将自己的SSL证书发送给客户端客户端验证证书的有效性。如果证书有效就生成一个随机的对称密钥然后用服务器的公钥加密这个对称密钥发送给服务器服务器用自己的私钥解密得到对称密钥客户端和服务器使用对称密钥进行加密通信这样即使数据在传输过程中被窃听窃听者也无法解密数据因为他们没有对称密钥。五、操作系统基础篇2道17. 进程和线程有什么区别这道题是操作系统基础面试的必考题也是很多人搞不清楚的问题。我给你用一个通俗的例子讲清楚进程就像一个工厂它有自己的厂房、设备和工人。线程就像工厂里的工人多个工人可以在同一个工厂里工作共享工厂的资源。具体来说进程和线程的区别主要有以下几点资源分配进程是资源分配的基本单位每个进程都有自己独立的地址空间、文件描述符、堆等资源线程是CPU调度的基本单位线程不拥有资源它共享所属进程的资源。开销创建和销毁进程的开销很大因为需要分配和回收资源创建和销毁线程的开销很小因为只需要保存少量的上下文信息。并发性多个进程可以并发执行一个进程中的多个线程也可以并发执行。通信进程间通信(IPC)比较复杂需要使用管道、消息队列、共享内存、信号量等方式线程间通信非常简单因为它们共享同一个地址空间可以直接读写全局变量。安全性进程之间是相互独立的一个进程崩溃不会影响其他进程线程之间是共享资源的一个线程崩溃可能会导致整个进程崩溃。举个例子你打开一个浏览器就是启动了一个进程。浏览器里的每个标签页就是一个线程。多个标签页可以同时加载网页共享浏览器的内存、CPU等资源。如果一个标签页崩溃了可能会导致整个浏览器崩溃。18. 什么是死锁死锁产生的条件是什么如何避免死锁死锁是指两个或多个进程在执行过程中由于竞争资源而造成的一种互相等待的现象。如果没有外力干预它们都将无法继续执行下去。死锁产生的四个必要条件互斥条件一个资源在同一时间只能被一个进程使用。请求和保持条件一个进程已经持有了至少一个资源又请求其他已经被其他进程持有的资源。不可剥夺条件进程已经获得的资源在未使用完之前不能被其他进程强行剥夺只能由进程自己释放。循环等待条件存在一个进程循环链链中的每个进程都在等待下一个进程所持有的资源。这四个条件必须同时满足才会产生死锁。只要破坏其中任何一个条件就可以避免死锁。避免死锁的方法主要有破坏互斥条件将独占资源改为共享资源。比如将打印机改为假脱机打印机多个进程可以同时打印。破坏请求和保持条件进程在开始执行之前一次性申请所有需要的资源。如果资源不够就不分配任何资源。破坏不可剥夺条件当一个进程已经持有了一些资源又请求其他已经被其他进程持有的资源时它必须释放已经持有的所有资源然后重新申请。破坏循环等待条件对所有的资源进行编号进程必须按照编号递增的顺序申请资源。六、数据库基础篇2道19. 什么是事务事务的ACID特性是什么事务是数据库操作的基本单位它是一组要么全部执行成功要么全部执行失败的SQL语句。事务的ACID特性是原子性(Atomicity)事务是一个不可分割的工作单位事务中的操作要么全部执行要么全部不执行。如果事务在执行过程中发生错误就会回滚到事务开始前的状态就像这个事务从来没有执行过一样。一致性(Consistency)事务执行前后数据库的完整性约束没有被破坏。比如A向B转账100元转账前后A和B的总金额应该保持不变。隔离性(Isolation)多个事务并发执行时一个事务的执行不能被其他事务干扰。也就是说不同的事务之间是相互隔离的每个事务都感觉不到其他事务在并发执行。持久性(Durability)一个事务一旦提交它对数据库的修改就应该是永久性的。接下来的其他操作或者故障不应该对它有任何影响。举个例子A向B转账100元这个操作可以分为两个步骤A的账户减去100元B的账户加上100元这两个步骤必须放在一个事务中。如果第一步执行成功第二步执行失败那么事务就会回滚A的账户会恢复到原来的状态不会出现A少了100元而B没有多100元的情况。20. 什么是索引索引有什么优缺点索引是数据库中用来提高查询速度的一种数据结构。它就像一本书的目录可以让你快速找到你需要的内容而不需要一页一页地翻书。索引的优点提高查询速度这是索引最大的优点。通过索引数据库可以快速定位到需要查询的数据而不需要进行全表扫描。提高排序和分组的速度索引可以让数据库在排序和分组的时候不需要进行额外的排序操作。索引的缺点占用磁盘空间索引需要占用额外的磁盘空间。如果表中有很多索引那么索引文件可能会比数据文件还要大。降低插入、更新和删除的速度当对表进行插入、更新和删除操作时数据库不仅要修改数据还要修改索引这样会降低这些操作的速度。所以索引并不是越多越好。我们应该只在经常查询的列上创建索引而在很少查询或者经常更新的列上不要创建索引。常见的索引类型有主键索引、唯一索引、普通索引、联合索引、全文索引等。总结兄弟们以上就是2026年面试被问烂了的20道编程基础题。这些题看起来简单但是真正能全部答对的人并不多。很多人都觉得基础不重要觉得只要会用框架、会调API就行了。但是我要告诉你基础才是最重要的。框架会过时API会变但是基础永远不会变。我见过很多人用TensorFlow、PyTorch写大模型写得溜得飞起但是连Python的基本数据类型都搞不清楚我见过很多人用Spring Boot写后端写得风生水起但是连TCP的三次握手都讲不明白。这些人在面试的时候很容易就会被面试官问倒。所以我劝大家在追热点技术的同时一定要把基础打牢。只有基础扎实了你才能走得更远。最后祝大家都能找到一份满意的工作P.S. 目前国内还是很缺AI人才的希望更多人能真正加入到AI行业共同促进行业进步增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow教程通俗易懂高中生都能看懂还有各种段子风趣幽默从深度学习基础原理到各领域实战应用都有讲解我22年的AI积累全在里面了。注意教程仅限真正想入门AI的朋友否则看看零散的博文就够了。

相关文章:

面试被问烂的20道编程基础题,你必须全会,不然别去面试

文章目录前言一、Python基础篇(6道)1. Python中list和tuple有什么区别?2. Python 3.7之后普通dict已经有序了,那OrderedDict还有存在的必要吗?3. Python中的深拷贝和浅拷贝有什么区别?4. Python中的*args和…...

TINA-TI仿真实战:从运放振铃到电源设计的电路调试指南

1. 为什么我们需要TINA-TI仿真软件 作为一个在硬件设计领域摸爬滚打多年的工程师,我见过太多因为电路设计问题导致的返工案例。记得有一次,我们团队花了两周时间手工焊接的样机,上电后运放输出端出现了严重的振铃现象,不得不全部拆…...

SteamAutoCrack:3步自动化破解Steam游戏的终极解决方案

SteamAutoCrack:3步自动化破解Steam游戏的终极解决方案 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack 你是否厌倦了每次想离线玩游戏时都要手动破解的繁琐过程&#xff1f…...

深入STM32F429 LTDC双图层与DMA2D:打造流畅UI界面的性能优化指南

STM32F429 LTDC与DMA2D深度优化:构建60FPS工业级UI的实战指南 在工业HMI和医疗设备等对显示性能要求严苛的场景中,流畅的UI动画和实时数据可视化往往成为系统瓶颈。STM32F429的LTDC控制器配合DMA2D加速器,通过合理的架构设计可实现媲美专业GP…...

Unlock Music:3种创新用法让你重新掌控被加密的音乐收藏

Unlock Music:3种创新用法让你重新掌控被加密的音乐收藏 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: htt…...

后端开发必看:设计高并发系统时,如何估算你的RTT和时延带宽积?

高并发系统设计实战:从RTT到时延带宽积的性能优化指南 在分布式系统的世界里,网络性能指标往往成为制约整体吞吐量的隐形瓶颈。我曾亲眼见证过一个日活百万的社交平台,因为微服务间调用的RTT估算偏差,导致高峰期请求堆积如山的惨状…...

加州自动驾驶测试报告解读:数据背后的技术演进与行业趋势

1. 从加州数据看自动驾驶的“成绩单”:2021年测试报告深度解读每年年初,自动驾驶圈子里不少人都会习惯性地去翻看一份来自美国加州的“成绩单”——加州机动车辆管理局发布的年度自动驾驶车辆测试报告。这份报告就像一份公开的“期中考试”排名&#xff…...

用Yii2快速构建微服务RESTful API全攻略

...

AI时代数据中心架构变革:从计算中心到加速基础设施

1. 从“计算中心”到“加速基础设施”:数据中心架构的范式转移最近和几个在头部云厂商做架构设计的老朋友聊天,话题总绕不开一个词:加速基础设施。这词儿听起来挺高大上,但说白了,就是咱们传统数据中心那套“通用计算存…...

Linux调试利器:用addr2line精准定位程序崩溃现场

1. 当程序崩溃时,我们该如何快速定位问题? 作为一名长期奋战在Linux开发一线的程序员,我最头疼的就是遇到程序突然崩溃的情况。那种看着终端输出"Segmentation fault (core dumped)"却无从下手的无力感,相信很多开发者都…...

STM32CUBEMX实战指南:串口DMA高效收发与自定义打印函数优化

1. 串口DMA基础与STM32CubeMX配置 第一次用STM32CubeMX配置串口DMA时,我对着密密麻麻的选项差点崩溃。后来发现只要掌握几个关键点,5分钟就能搞定稳定可靠的DMA通信。先解释下为什么需要DMA:当你用传统方式通过串口发送"Hello World&quo…...

你的密码正在裸奔!一张RTX 5090,1小时破解60%的MD5密码

网络安全文章 文章目录 网络安全文章前言一、卡巴斯基到底做了什么?1.1 测试环境1.2 测试结果 二、为什么MD5这么脆弱?2.1 MD5设计初衷就不是用来存密码的2.2 MD5 vs bcrypt vs Argon2 对比 三、真实案例:算力平台租卡破解有多便宜&#xff1…...

英雄联盟智能助手:5个核心功能让你的游戏体验提升300%

英雄联盟智能助手:5个核心功能让你的游戏体验提升300% 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾因错过对局接受而被…...

混合原型验证:软硬件协同的芯片设计革命

1. 混合原型验证:从割裂到统一的芯片设计革命在芯片设计的漫长周期里,硬件工程师和软件工程师常常像是在两个平行世界里工作。硬件团队埋头于RTL编码、综合、布局布线,最终将设计烧录进FPGA原型板,进行物理层面的调试和性能测试。…...

信息学奥赛刷题实战:用C++搞定OpenJudge NOI 1.4 09题(判断整除)的四种思路

信息学奥赛刷题实战:用C搞定OpenJudge NOI 1.4 09题(判断整除)的四种思路 在信息学奥赛(NOI)和OpenJudge等编程竞赛平台上,一道看似简单的题目往往隐藏着多种解题思路。今天,我们就以OpenJudge …...

Agent设计模式全景图——从ReAct到Multi-Agent的完整知识体系

Agent概念在2023年就已出现,2024年是框架快速迭代的一年。到了2026年,Agent设计模式逐渐成熟,成为工程实践的关键。 GitHub上关于Agent的开源项目突破10万个,LangChain、LangGraph、AutoGen、CrewAI……框架层出不穷。但翻遍这些文…...

别再花钱买服务器了!手把手教你用Sakura Frp免费搞定内网穿透(Windows保姆级教程)

零成本实现内网穿透:Windows平台实战指南 在个人开发和小型项目测试阶段,许多开发者都面临一个共同难题——如何将本地服务暴露到公网供临时访问?传统解决方案往往需要租用云服务器,不仅成本高昂,配置过程也相当复杂。…...

告别内存焦虑:用STM32+外部SRAM(IS62WV51216)实现大数组和GUI缓存

STM32外部SRAM实战:突破内存限制的工程化解决方案 当你在STM32上开发图形界面或处理音频流时,是否遇到过程序突然崩溃的窘境?那些隐藏在编译通过背后的内存溢出问题,往往在项目后期才暴露出来。最近接手的一个智能家居控制面板项目…...

5G技术授权商业化的七大挑战与市场可行性深度解析

1. 项目概述:一次关于5G技术授权商业可行性的深度探讨最近在整理行业资料时,翻到一篇2019年EE Times上的旧文,标题挺抓人眼球,叫《授权华为5G技术可能是个坏主意的30个理由》。文章的核心是讨论当时华为创始人提出的一项设想&…...

LangGraph、OpenClaw、Hermes:三种 Agent 路线,不是一回事

开头 这两年,只要聊到 Agent,绕不开三个名字:LangGraph、OpenClaw、Hermes。 它们都很火。 但也很容易被混在一起。 有人把 LangGraph 当成一个“Agent 产品”。 有人把 OpenClaw 当成一个“Agent 框架”。 也有人把 Hermes 理解成“另…...

Honey Select 2终极优化指南:HS2-HF Patch完整解决方案

Honey Select 2终极优化指南:HS2-HF Patch完整解决方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是专为《Honey Select 2》游戏设…...

5分钟搞定专业神经网络图:Draw.io开源模板库终极指南

5分钟搞定专业神经网络图:Draw.io开源模板库终极指南 【免费下载链接】Neural-Network-Architecture-Diagrams Diagrams for visualizing neural network architecture 项目地址: https://gitcode.com/gh_mirrors/ne/Neural-Network-Architecture-Diagrams 你…...

告别Wireshark手动分析:用Python的flowcontainer库5分钟搞定pcap流量特征提取

用Python的flowcontainer库实现pcap流量特征自动化提取 每次面对几十GB的pcap文件时,你是否也厌倦了在Wireshark中反复点击、筛选、导出数据的繁琐操作?网络流量分析是安全研究和数据挖掘的基础工作,但传统的手动分析方法效率低下&#xff0…...

硬件工程师实战指南:工业物联网安全、无线充电与TSN网络设计解析

1. 项目概述:一场面向硬件工程师的线上技术盛宴最近在整理行业资料时,翻到了EE Times几年前发布的一个“即将到来的线上技术活动”汇总页面。虽然发布时间是2018年,但里面提到的几个技术主题——工业物联网安全、硬件身份认证、工业以太网演进…...

从PCB走线到天线:手把手教你搞定Sx1262射频前端阻抗匹配(附常见错误排查)

从PCB走线到天线:手把手教你搞定Sx1262射频前端阻抗匹配(附常见错误排查) 在LoRa终端硬件开发中,射频前端的阻抗匹配往往是决定通信质量的关键因素。许多工程师在完成Sx1262芯片外围电路设计后,常会遇到通信距离不理想…...

智能设备语音交互进阶:从‘慢交互’到‘快交互’,详解ONESHOT模式下的音频残留音过滤实战

智能设备语音交互进阶:ONESHOT模式下的音频残留音过滤实战 在智能语音交互领域,ONESHOT模式已经成为提升用户体验的关键技术。这种允许用户在唤醒设备后无需二次唤醒即可直接下达指令的交互方式,正在重塑人机对话的自然流畅度。然而&#xff…...

Linux终端美化:cmatrix屏保的安装与个性化配置指南

1. 初识cmatrix:从黑客帝国到你的终端 第一次看到cmatrix运行效果时,我正窝在咖啡馆调试服务器。黑色背景上不断下落的绿色字符,瞬间让我想起《黑客帝国》里尼奥看到的数字雨。这个诞生于2002年的开源项目,最初只是开发者Chris Al…...

NotebookLM深度绑定Google Drive的终极方案(含OAuth2作用域最小化清单+服务账号部署模板)

更多请点击: https://intelliparadigm.com 第一章:NotebookLM深度绑定Google Drive的终极方案(含OAuth2作用域最小化清单服务账号部署模板) NotebookLM 本地知识增强能力依赖于安全、稳定且权限精确的 Google Drive 数据接入。直…...

苹果W1芯片如何通过低功耗无线技术重塑TWS耳机体验

1. 无线音频的功耗困局与苹果的破局思路 2016年9月,当苹果在发布会上首次亮出那对剪掉线缆的AirPods时,整个消费电子行业都在问同一个问题:它是怎么做到的?更具体地说,它如何解决了无线耳机领域最核心、也最令人头疼的…...

为什么92%的AI企业还没部署TEE for AI?,20年系统安全专家亲历的4类认知盲区与2026合规倒计时应对清单

更多请点击: https://intelliparadigm.com 第一章:AI原生可信执行环境:2026奇点智能技术大会TEE for AI 在2026奇点智能技术大会上,TEE for AI(AI-Native Trusted Execution Environment)正式成为下一代AI…...