推荐收藏!算法岗最常被问到的数据结构面试题总结!

2024-03-10 11:52

本文主要是介绍推荐收藏!算法岗最常被问到的数据结构面试题总结!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

今天分享给大家算法岗最常考的数据结构的面试题,希望对后续找工作的有所帮助。喜欢记得点赞、收藏、关注。更多技术交流&面经学习,可以文末加入我们交流群。

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

代码实现:

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i in range(len(nums)):for j in range(i+1, len(nums)):if nums[i] + nums[j] == target:return [i, j]

解题思路:嵌套遍历从数组中取出两个数相加,用嵌套的for循环,判断相加的结果是否满足要求,如果满足则用列表返回两个数据的索引。因为同一个元素不能重复出现,所以索引 j 从 i+1 开始遍历。

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

代码实现:

class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:l1num, l2num = l1.val, l2.vali, j = 0, 0cur = l1while cur.next:cur = cur.nexti += 1l1num += cur.val * 10 ** icur2 = l2while cur2.next:cur2 = cur2.nextj += 1l2num += cur2.val * 10 ** jsumnum = l1num + l2numresult = ListNode()cur = resultfor s in str(sumnum)[::-1]:cur.next = ListNode(int(s))cur = cur.nextreturn result.next

解题思路:先按照逆序的方式将 l1 和 l2 两个链表转化成对应的整数,转化时依次将第 i 个节点的数字乘 10 的 i 次方,并全部相加,i 从 0 开始。得到两个整数,计算两个整数之和。然后将整数之和倒序保存到链表中,每个节点一个数字。我采用的方式是将两数之和转换成字符串倒着遍历,再将每个数字转换回整数,然后创建节点添加到链表中。

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

代码实现:

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:length = 0for i in range(len(s)):slist = []for j in range(i, len(s)):if s[j] not in slist:slist.append(s[j])else:breaklength = max(length, len(slist))return length

解题思路:遍历字符串的索引,以每一个索引位为标志位,从标志位往后找最长的子串。最长子串的判断方式用列表实现,如果连续的字符不在列表中,则添加进列表,遇到重复的字符时跳出内循环。循环结束后计算列表的长度,并更新当前的最长长度。每次移动标志位,清空用于保存字符的列表。

4. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

代码实现:

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:m = len(nums1)n = len(nums2)if m > n:return self.findMedianSortedArrays(nums2,nums1)k = (m + n + 1)//2left = 0right = mwhile left < right :m1 = left +(right - left)//2m2 = k - m1if nums1[m1] < nums2[m2-1]:left = m1 + 1else:right = m1m1 = leftm2 = k - m1 c1 = max(nums1[m1-1] if m1 > 0 else float("-inf"), nums2[m2-1] if m2 > 0 else float("-inf") )if (m + n) % 2 == 1:return c1c2 = min(nums1[m1] if m1 < m else float("inf"), nums2[m2] if m2 <n else float("inf"))return (c1 + c2) / 2

解题思路:此题在Leetcode上的难度是困难,属于等级最高的难度(简单、中等、困难),困难的原因是要求时间复杂度为O(log (m+n))。主要目的是考算法思路,并且要提交者自己实现算法。如果没有时间复杂度的要求,实现其实很简单,如下代码就可以通过力扣的用例(甚至可以更简单,导入一个求中位数的函数):

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:nums = sorted(nums1 + nums2)if len(nums) % 2 == 0:return (nums[int(len(nums) // 2) - 1] + nums[int(len(nums) // 2)]) / 2else:return nums[len(nums) // 2]

因为要求时间复杂度为 O(log (m+n)),我一开始也没有想到好的方法,所以参考了力扣用户powcai的答案。两个数组都是正序排列的,所以找到中位数的策略是从两个数组中找出排序在前一半的数据,中间的数字就是中位数。也就是找出第 k 大的那个数字,k 是两个数组长度之和的一半,或中间的两个数(k, k+1)。

假如使用遍历,时间复杂度将会是 O(m+n),为了将时间复杂度降到题目要求的O(log (m+n)),需要使用二分法的方式查找。遍历是每次排除一个数据不是第 k 大,二分查找每次排除 k/2 个数据不是第 k 大。在这个思路的基础上,结合上面的代码就可以分析出解题办法了。如果你需要了解更详细的解题细节,可以自己再搜索更多的参考答案。

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000 s 仅由数字和英文字母组成

代码实现:

class Solution:def longestPalindrome(self, s: str) -> str:max_length = 1start_index = 0i = 0while i < len(s):length = 1left = i - 1while left >= 0 and s[left] == s[i]:length += 1left -= 1right = i + 1while right < len(s) and s[right] == s[i]:length += 1right += 1i += 1while left >= 0 and right < len(s) and s[left] == s[right]:length += 2left -= 1right += 1if length > max_length:max_length = lengthstart_index = left+1i += 1return s[start_index:start_index+max_length]

解题思路:要找到字符串 s 中的最长回文子串,需要找到最长回文子串的长度 max_length 和回文子串的开始索引 start_index 。因为 s 的长度最短为1,所以 max_length 最小为 1,start_index 初始为 0,以此为初始值,当找到更长的回文子串时更新两者的值。

遍历字符串的每一个字符,以每一个字符为标志位,判断标志位左侧的字符是否与标志位的字符相同,如果相同则继续向左找,每找到一个字符,回文子串的长度加1,右侧也同理。这样可以找到标志位两侧与标志位相同的所有连续字符,包含了奇数个和偶数个两种情况。

找完与标志位相同的连续字符后,再继续找左边的字符与右边的字符相同的情况,此时每找到一对相同的字符,回文子串的长度加2,直到两边的字符不同或到达字符串 s 的边界。完成后判断此次找到的最长回文长度和前面找到的长度,如果更长就更新 max_length 和 start_index 的值。

进阶:本文使用 while 循环,在向右找到与标志位相同的连续字符时,标志位的索引 i 也加1,这样可以减少 while 的遍历次数,提高程序的运行效率,跑Leetcode上提供的用例可以缩短5倍左右的时间。(同时,在这种方式的循环中,不需要向左寻找与标志位相同的连续字符,代码不会执行到。上面还保留着向左寻找的代码,是为了与解题思路保持一致,方便理解。)

技术交流

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗面试与技术交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2060,备注:技术交流+CSDN

用通俗易懂的方式讲解系列

  • 用通俗易懂的方式讲解:不用再找了,这是大模型最全的面试题库
  • 用通俗易懂的方式讲解:这是我见过的最适合大模型小白的 PyTorch 中文课程
  • 用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain
  • 用通俗易懂的方式讲解:基于 LangChain + ChatGLM搭建知识本地库
  • 用通俗易懂的方式讲解:基于大模型的知识问答系统全面总结
  • 用通俗易懂的方式讲解:ChatGLM3 基础模型多轮对话微调
  • 用通俗易懂的方式讲解:最火的大模型训练框架 DeepSpeed 详解来了
  • 用通俗易懂的方式讲解:这应该是最全的大模型训练与微调关键技术梳理
  • 用通俗易懂的方式讲解:Stable Diffusion 微调及推理优化实践指南
  • 用通俗易懂的方式讲解:大模型训练过程概述
  • 用通俗易懂的方式讲解:专补大模型短板的RAG
  • 用通俗易懂的方式讲解:大模型LLM Agent在 Text2SQL 应用上的实践
  • 用通俗易懂的方式讲解:大模型 LLM RAG在 Text2SQL 上的应用实践
  • 用通俗易懂的方式讲解:大模型微调方法总结
  • 用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了
  • 用通俗易懂的方式讲解:掌握大模型这些优化技术,优雅地进行大模型的训练和推理!
  • 用通俗易懂的方式讲解:九大最热门的开源大模型 Agent 框架来了

这篇关于推荐收藏!算法岗最常被问到的数据结构面试题总结!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/794157

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Spring Boot 中整合 MyBatis-Plus详细步骤(最新推荐)

《SpringBoot中整合MyBatis-Plus详细步骤(最新推荐)》本文详细介绍了如何在SpringBoot项目中整合MyBatis-Plus,包括整合步骤、基本CRUD操作、分页查询、批... 目录一、整合步骤1. 创建 Spring Boot 项目2. 配置项目依赖3. 配置数据源4. 创建实体类

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于