经典算法类笔试或面试题及答案

合集下载

算法面试题及答案

算法面试题及答案

算法面试题及答案一、数组与字符串1.1 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数,并返回它们的数组下标。

答案:```pythondef two_sum(nums, target):hash_map = {}for i, num in enumerate(nums):complement = target - numif complement in hash_map:return [hash_map[complement], i]hash_map[num] = ireturn []```解释:使用哈希表存储数组中的每个元素及其下标。

遍历数组,计算当前元素与目标值的差值,并检查差值是否已经在哈希表中。

如果存在,返回当前元素的下标和差值对应的下标。

如果不存在,将当前元素及其下标加入哈希表。

1.2 如何判断一个字符串是否为另一个字符串的旋转?答案:```pythondef is_rotation(s1, s2):if len(s1) != len(s2):return Falsereturn s1 + s1 == s2```解释:首先检查两个字符串的长度是否相等,如果不相等则直接返回False。

然后将一个字符串与自身拼接,如果拼接后的字符串包含另一个字符串,则说明原字符串是另一个字符串的旋转。

二、链表问题2.1 给定一个链表和一个特定值,删除链表中所有出现该值的节点。

答案:```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef delete_elements(head, val):d = ListNode(0)d.next = headprev = dwhile prev.next:if prev.next.val == val:prev.next = prev.next.nextelse:prev = prev.nextreturn d.next```解释:创建一个哑节点(dummy node)作为链表的头节点,并用一个指针`prev`指向哑节点。

算法岗位求职笔试题目大全

算法岗位求职笔试题目大全

算法岗位求职笔试题目大全算法岗位求职笔试题目已知二叉树的前序中序求后序,还有问已知中序后序能否确定一棵二叉树。

2. 冒泡排序算法的结束条件是什么。

3. 集合关系是一个____的集合。

线性结构的关系是_____的关系。

树形结构的关系是_____的关系。

图形结构的关系是_____的关系。

4. 一个二分查找序列,问关键字的比较次数。

5. (1) 给了三张数据表,画出三张数据表的E-R图,可能就是标出主键外键即可。

(2) 插入数据库的SQL语句。

(3) 更新语句的SQL语句。

(4) 选择给定范围的数据(价格大于1000小于3000),并且按照价格逆序排列。

6. ISO网络模型和TCP/IP的网络层对应关系。

答案:应用层、表示层、会话层对应应用层,传输层对应传输层,网络层对应网络层,数据链路曾、物理层对应网络接口层。

7. 多线程多进程的一些基础知识。

8. 死锁的来源,原因,及解决方法。

第1页共5页1.规律:1 13 15 17 _ 1913 115 135 _ 163-1 0 4 22 _ 1182. 从12个乒乓球中找出一个不知道轻重的乒乓球。

3. 飞机加油的问题。

附加题:(java)1. 子类父类继承的问题。

2. 实现线程的几种方式:继承Thread类,实现Runable接口,Timer等等。

3. 问一个try,catch,finally的问题,finally里面的语句是必须执行的,知道这个就可以了。

4. servlet的生命周期。

京东算法应聘笔试题1、数据结构若一颗二叉树的前序遍历为a,e,b,d,c后序遍历为b,c,d,e,a,则根节点的孩子节点( )A:只有eB:有e,bC:有e,cD:不确定解析:先序遍历的首结点一定是根,所以,a是整个树的根。

假设a的左右孩子分别是a.left、a.right,同时,以a.left为根的子树称为,以a.right为根的子树称为,则整个树的前序遍历是:a a.left a.right整个树的后序遍历是: a.left a.right a对照aebdc和bcdea,得:a.left:e:b,c,d:NULLa.right:NULL即,a只有左孩子e。

算法面试题及答案

算法面试题及答案

算法面试题及答案通常,在算法方面的面试中,面试官会给出一系列问题,要求应聘者解决或给出最佳解决方案。

这些问题旨在评估应聘者的算法思维能力和解决问题的能力。

以下是一些常见的算法面试问题及其解答。

问题一:反转字符串给定一个字符串,编写一个函数来翻转字符串中的字符顺序。

例如,输入:"Hello, World!",输出:"!dlroW ,olleH"。

解答:```javapublic String reverseString(String s) {char[] charArray = s.toCharArray();int left = 0;int right = s.length() - 1;while (left < right) {char temp = charArray[left];charArray[left] = charArray[right];charArray[right] = temp;left++;right--;return new String(charArray);}```问题二:判断一个数字是否为素数给定一个正整数,判断它是否是素数(只能被1和自身整除)。

例如,输入:17,输出:是素数。

解答:```javapublic boolean isPrime(int num) {if (num <= 1) {return false;}for (int i = 2; i * i <= num; i++) {if (num % i == 0) {return false;}}return true;```问题三:找出数组中的最大值和最小值给定一个整数数组,找出数组中的最大值和最小值。

例如,输入:[4, 2, 9, 1, 7],输出:最大值为9,最小值为1。

解答:```javapublic void findMinMax(int[] nums) {int min = Integer.MAX_VALUE;int max = Integer.MIN_VALUE;for (int num : nums) {min = Math.min(min, num);max = Math.max(max, num);}System.out.println("最小值为:" + min);System.out.println("最大值为:" + max);}```问题四:判断一个字符串是否是回文字符串给定一个字符串,判断它是否是回文字符串(正反读都一样)。

算法工程师面试真题单选题100道及答案解析

算法工程师面试真题单选题100道及答案解析

算法工程师面试真题单选题100道及答案解析1. 以下哪种数据结构适合用于实现快速查找最大值和最小值?A. 栈B. 队列C. 堆D. 链表答案:C解析:堆可以快速地获取最大值和最小值。

2. 快速排序在最坏情况下的时间复杂度是?A. O(nlogn)B. O(n^2)C. O(n)D. O(logn)答案:B解析:快速排序在最坏情况下,每次划分都极不均匀,时间复杂度为O(n^2)。

3. 以下哪种算法常用于在未排序的数组中查找特定元素?A. 冒泡排序B. 二分查找C. 顺序查找D. 插入排序答案:C解析:顺序查找适用于未排序的数组查找特定元素。

4. 一个有向图的邻接表存储结构中,顶点的邻接点是按照什么顺序存储的?A. 随机顺序B. 顶点编号的大小顺序C. 插入的先后顺序D. 无法确定答案:C解析:邻接表中顶点的邻接点是按照插入的先后顺序存储的。

5. 深度优先搜索遍历图的时间复杂度是?A. O(n)B. O(n + e)C. O(n^2)D. O(e)答案:B解析:深度优先搜索遍历图的时间复杂度为O(n + e),其中n 是顶点数,e 是边数。

6. 以下哪种排序算法是稳定的排序算法?A. 快速排序B. 希尔排序C. 冒泡排序D. 选择排序答案:C解析:冒泡排序是稳定的排序算法。

7. 一个具有n 个顶点的无向完全图,其边的数量为?A. n(n - 1) / 2B. n(n - 1)C. n^2D. 2n答案:A解析:无向完全图的边数为n(n - 1) / 2 。

8. 动态规划算法的基本思想是?A. 分治法B. 贪心算法C. 把问题分解成多个子问题并保存子问题的解D. 回溯法答案:C解析:动态规划的基本思想是把问题分解成多个子问题并保存子问题的解,避免重复计算。

9. 以下关于哈希表的说法,错误的是?A. 哈希表的查找时间复杂度为O(1)B. 哈希冲突可以通过开放定址法解决C. 哈希表的空间复杂度是固定的D. 哈希函数的设计会影响哈希表的性能答案:C解析:哈希表的空间复杂度不是固定的,取决于元素数量和负载因子等。

算法笔试题及答案

算法笔试题及答案

算法笔试题及答案1. 数组中的重复项给定一个整数数组,找出其中不重复的元素。

每个数字在数组中最多出现两次,除了一个数字,它出现了三次。

答案:使用一个哈希表来记录每个数字出现的次数。

遍历数组,对于每个数字,如果它在哈希表中,增加它的计数,如果计数达到3,则它是重复的元素。

2. 最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。

答案:首先,将数组中的第一个字符串作为最长公共前缀的候选。

然后,遍历数组中的其他字符串,逐个字符比较,如果发现不匹配,就截断当前最长公共前缀。

最后,返回找到的最长公共前缀。

3. 旋转数组给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。

答案:首先,将数组的后k个元素移动到数组的前面,然后将剩余的元素向右移动k个位置。

可以通过三次反转数组的前k个元素、剩余元素和整个数组来实现。

4. 寻找缺失的数字一个整数数组包含从1到n的所有整数,但其中一个数字丢失了,找到那个丢失的数字。

答案:使用数学公式:数组的和减去1到n的和,结果就是缺失的数字。

5. 合并两个有序数组给定两个有序整数数组 nums1 和 nums2,其中 nums2 的元素个数大于 nums1,将 nums2 合并到 nums1 中,使合并后的数组仍然有序。

答案:从后向前遍历两个数组,比较两个数组的末尾元素,将较大的元素放到合并数组的末尾,然后继续比较前一个元素,直到一个数组遍历完,将剩下的元素直接追加到合并数组的末尾。

6. 实现strStr()实现 strStr() 函数,给定一个主字符串 haystack 和一个模式字符串 needle,返回模式字符串在主字符串中的开始位置。

答案:使用暴力搜索,遍历主字符串,对于每个位置,检查从该位置开始的子字符串是否与模式字符串相等。

7. 寻找旋转排序数组中的最小值假设按照升序排序的数组在某个未知的点上进行了旋转。

(例如,数组 [0,1,2,4,5,6,7] 可能旋转为 [4,5,6,7,0,1,2])。

经典算法类笔试或面试题及答案

经典算法类笔试或面试题及答案

常见算法笔试或面试题1、Is it a loop ? (判断链表是否有环?)Assume that we have a head pointer to a link-list. Also assume that we know the list is single-linked. Can you come up an algorithm to check whether this link list includes a loop by using O(n) time and O(1) space where n is the length of the list? Furthermore, can you do so with O(n) time and only one register?方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。

同样的,可以找到链表的中间节点。

同上。

2、设计一个复杂度为n的算法找到链表倒数第m个元素。

最后一个元素假定是倒数第0个。

提示:双指针查找3、用最简单的方法判断一个LONG整形的数A是2^n(2的n次方)提示:x&(x-1)4、两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多?提示:相同。

假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。

5、给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。

方法一:使用hash表。

使用a中元素创建hash表,hash控制在适当规模。

在hash中查找b的元素,找不到的url先存在新文件中,下次查找。

如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。

再次循环。

方法二:对于hash表项增加一项记录属于的文件a,b。

计算机算法面试题及答案

计算机算法面试题及答案

计算机算法面试题及答案一、算法基础知识算法是计算机科学的核心内容之一,它是解决实际问题的有效工具。

在计算机算法面试中,考官通常会涉及算法的基础知识,因此我们需要对一些常见的算法和数据结构有所了解。

1. 算法的定义及特性算法是解决问题的一系列有序步骤的描述。

算法应该具备的特性包括:输入、输出、确定性、有限性、可行性。

2. 时间复杂度与空间复杂度在面试中,评估算法性能的指标通常是时间复杂度和空间复杂度。

时间复杂度是指算法运行所需时间与问题规模的关系,通常用大O记法表示。

空间复杂度是指算法所需的额外空间与问题规模的关系。

3. 常见数据结构在面试中,我们需要对一些常见的数据结构有所了解,比如数组、链表、栈、队列、树、图等。

我们需要了解它们的特点、操作方法以及常见的应用场景。

4. 常见算法在面试中,会考察一些常见的算法,比如排序算法(冒泡排序、插入排序、选择排序、快速排序、归并排序等),查找算法(线性查找、二分查找等),图算法(深度优先搜索、广度优先搜索等),动态规划算法等。

二、面试题及答案下面我将列举一些常见的算法面试题,并给出对应的答案及解析。

1. 请实现一个二分查找算法。

答案:```pythondef binary_search(nums, target):left = 0right = len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return midelif nums[mid] > target:right = mid - 1else:left = mid + 1return -1```解析:二分查找算法是一种高效的查找算法,它的时间复杂度为O(logn)。

在有序数组中查找目标元素,我们通过不断缩小查找范围,直到找到目标元素或范围为空。

2. 请实现一个快速排序算法。

答案:```pythondef quick_sort(nums):if len(nums) <= 1:return numspivot = nums[0]left = [x for x in nums[1:] if x <= pivot]right = [x for x in nums[1:] if x > pivot]return quick_sort(left) + [pivot] + quick_sort(right)```解析:快速排序算法是一种高效的排序算法,它的时间复杂度为O(nlogn)。

算法面试题和答案

算法面试题和答案

算法面试题和答案1、什么是算法?为什么需要算法?算法是一个定义明确的计算过程,它将一些值或一组值作为输入,并产生一组值或一些值作为输出。

为什么需要算法?算法提供了问题的基本思想和解决问题的方法。

使用算法的一些原因如下:算法提高了现有技术的效率。

比较算法相对于其他技术的性能。

算法为设计者提供了对问题的需求和目标的强烈描述。

算法提供了对程序流程的合理理解。

算法测量方法在不同情况下的性能(最佳情况、最坏情况、平均情况)。

算法识别该算法所需的资源(输入/输出、内存)周期。

借助算法,可以衡量和分析问题的复杂性时间和空间。

算法还降低了设计成本。

2、算法的复杂性是什么?算法的复杂性是一种分类算法与替代算法相比效率的方法。

它的重点是执行时间如何随着要处理的数据集而增加。

算法的计算复杂度在计算中很重要。

非常适合根据算法所需的相对时间量或相对空间量对算法进行分类,并将时间/空间需求的增长指定为输入大小的函数。

时间复杂度时间复杂度是作为输入大小的函数的程序运行时间。

空间复杂度空间复杂度根据算法完成其任务需要多少空间来分析算法。

空间复杂度分析在计算的早期(当计算机上的存储空间有限时)至关重要。

现在很少出现空间问题,因为电脑上的空间足够大。

我们实现了以下类型的复杂性分析最坏情况:f(n)它由在任何大小为n的实例上采取的最大步数定义。

最佳情况:f(n)它由在任何大小为n的实例上采取的最小步数定义。

平均情况:f(n)它由在任何大小为n的实例上采取的平均步数定义。

3、编写一个算法来反转一个字符串。

例如将字符串,bcdef〃,返回结果将是〃fedcba"第1步:开始第2步:取两个变量i和j第3步:Iength(String)-I,将J设置在最后一个位置第4步:string [0],在第一个字符上设置L第5 步:string [i]与String [j]互换第6步:将i增加1第7步:将j加1第8步:如果i>j则转到第3步第9步:停止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常见算法笔试或面试题
1、Is it a loop ? (判断链表是否有环?)
Assume that we have a head pointer to a link-list. Also assume that we know the list is single-linked. Can you come up an algorithm to check whether this link list includes a loop by using O(n) time and O(1) space where n is the length of the list? Furthermore, can you do so with O(n) time and only one register?
方法:使用两个指针,从头开始,一个一次前进一个节点,一个前进2个节点,则最多2N,后两个指针可以重合;如果无环,则正常停止。

同样的,可以找到链表的中间节点。

同上。

2、设计一个复杂度为n的算法找到链表倒数第m个元素。

最后一个元素假定是倒数第0个。

提示:双指针查找
3、用最简单的方法判断一个LONG整形的数A是2^n(2的n次方)
提示:x&(x-1)
4、两个烧杯,一个放糖一个放盐,用勺子舀一勺糖到盐,搅拌均匀,然后舀一勺混合物会放糖的烧杯,问你两个烧杯哪个杂质多?
提示:相同。

假设杂质不等,那么将杂质放回原杯中,则杯中物体重量必变化,不合理。

5、给你a、b两个文件,各存放50亿条url,每条url各占用64字节,内存限制是4G,让你找出a、b文件共同的url。

方法一:使用hash表。

使用a中元素创建hash表,hash控制在适当规模。

在hash中查找b的元素,找不到的url先存在新文件中,下次查找。

如果找到,则将相应的hash表项删除,当hash表项少于某个阈值时,将a中新元素重新hash。

再次循环。

方法二:对于hash表项增加一项记录属于的文件a,b。

只要不存在的表项即放入hash表中,一致的项则删除。

注意:可能存在很多重复项,引起插入,删除频繁。

6、给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。

现在给你一个字典,用户输入一个单
词,让你根据字典找出这个单词有多少个兄弟单词。

提示:将每个的单词按照字母排序,则兄弟单词拥有一致的字母排序(作为单词签名)。

使用单词签名来查找兄弟单词。

7、五桶球,一桶不正常,不知道球的重量和轻重关系,用天平称一次找出那桶不正常的球。

8、给两个烧杯,容积分别是m和n升(m!=n),还有用不完的水,用这两个烧杯能量出什么容积的水?
m, n, m+n, m-n
以及线性叠加的组合
9、写出一个算法,对给定的n个数的序列,返回序列中的最大和最小的数。

你能设计出一个算法,只需要执行1.5n次比较就能找到序列中最大和最小的数吗?能否再少?
提示:先通过两两比较,区分大小放入“大”,“小”两个数组中。

从而最大数在“大”数组中,最小数在“小”数组中。

10、给你一个由n-1个整数组成的未排序的序列,其元素都是1到n中的不同的整数。

请写出一个寻找序列中缺失整数的线性-时间算法。

提示:累加求和
11、void strton(const char* src, const char* token) 假设src是一长串字符,token存有若干分隔符,只要src的字符是token中的任何一个,就进行分割,最终将src按照token分割成若干单词。

找出一种O(n)算法?
提示:查表的方法,将所有的字符串存储在长度为128的数组中,并将作为分隔符的字符位置1,这样即可用常数时间判断字符是否为分隔符,通过n次扫描,将src分割成单词。

12、一个排好序的数组A,长度为n,现在将数组A从位置m(m<n,m 未知)分开,并将两部分互换位置,假设新数组记为B,找到时间复杂度为O(lgn)的算法查找给定的数x是否存在数组B中?
提示:同样采用二分查找。

核心思想就是确定所查找数所在的范围。

通过比较3个数(头,尾,中间)和所查找数之间的关系,可以确定下次
查找的范围。

一个排好序的数组A,长度为n,现在将数组A从位置m(m<n,m已知)分开,并将两部分互换位置,设计一个O(n)的算法实现这样的倒置,只允许使用一个额外空间。

(循环移位的效率不高)
提示:(A’B’)’ = BA
13、给出Vector的一个更好实现。

(STL的vector内存的倍增的,但是每次倍增需要拷贝已存元素,平均每个元素需要拷贝一次,效率不高)提示:可使用2^n的固定长度作为每次分配的最小单位,并有序的记录每个块的首地址。

这中结构同样可以实现线性查找,并且拷贝代价很低(仅有指针)
14、给出已排序数组A,B,长度分别为n,m,请找出一个时间复杂度为(lgn)的算法,找到排在第k位置的数。

提示:二分查找。

15、给出任意数组A,B,长度分别为n,m,请找出一个时间复杂度为(lgn)的算法,找到排在第k位置的数。

提示:通过最小堆记录k个数,不断更新,扫描一次完毕。

16、假设数组A有n个元素,元素取值范围是1~n,判定数组是否存在重复元素?要求复杂度为O(n)。

法1:使用n的数组,记录元素,存在记为1,两次出现1,即重复。

法2:使用m的数组,分别记录大小:n/m, 2n/m …..的元素个数。

桶方法
法3:累加求和。

可用于求仅有一个元素重复的方法。

17、给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X。

给出一个O(n)的算法。

提示:从中间向两边查找。

利用有序的条件
18、给定排好序的数组A,大小为n,请给出一个O(n)的算法,删除重复元素,且不能使用额外空间。

提示,既然有重复,必有冗余空间。

将元素放入数组的前面,并记录下次可放位置,不断向后扫描即可。

19、给定两个排好序的数组A,B,大小分别为n,m。

给出一个高效算
法查找A中的哪些元素存在B数组中。

注意:一般在大数组中执行二分查找,将小数组的元素作为需查找的对象。

20、问:有1000桶酒,其中1桶有毒。

而一旦吃了,毒性会在1周后发作。

现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠。

答案:10只。

将酒编号为1~1000 将老鼠分别编号为1 2 4 8 16 32 64 128 256 512 喂酒时 让酒的编号等于老鼠编号的加和 如:17号酒喂给1号和16号老鼠 76号酒喂给4号、8号和64号老鼠 七天后将死掉的老鼠编号加起来 得到的编号就是有毒的那桶酒 因为2的10次方等于1024 所以10只老鼠最多可以测1024桶酒
证明如下:使用二进制表示:01, 10, 100, 1000, … , 1,000,000,000。

对于任何一个小于1024的数,均可以采用前面的唯一一组二进制数来表示。

故成立。

设计一组最少个数砝码,使得天平能够称量1~1000的重量。

如果砝码只能放单边,1,2 ,4 , 512最好。

(只能单加)
如果允许砝码双边放,1, 3, 9, 27…. 最好。

(可加可减)已知1,3,如何计算下一个数。

现可称重量1,2,3,4。

设下个数为x,可称重量为, x-4, x-3, x-2, x-1, x, x+1, x+2, x+3, x+4。

为使砝码最好,所称重量应该不重复(浪费)。

故x=9。

同理,可得后面。

图形算法题
1 如何判断一个点是否在一个多边形内?
提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内。

一个非常有用的解析几何结论:如果P2(x1,y1), P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一:
| x1 y1 1 |
| x2 y2 1 | = x1y2 + x3y1 + x2y3 – x3y2 –x2y1 – x1y3
| x3 y3 1 |
当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正。

这个公式可以在固定的时间内,检查一个点位于两点确定直线的哪侧,以及点到直线的距离(面积=底*高/2)。

这个结论:可以用来判断点是否在点是否在三角形内。

法1:判断点和三角形三边所行程的3个三角形的面积之和是否等于原来三角形的面积。

(用了三次上面的公式)。

法2:判断是否都在三条边的同一边,相同则满足,否则不在三角形内。

2 给出两个n为向量与0点形成角的角平分线。

提示:对两条边进行归一化,得到长度为1的两点,取两个的中点即可。

相关文档
最新文档