‘壹’ 如何准备算法面试
主要介绍算法面试的一些问题、以及如何准备算法面试
!--more--
算法面试不仅仅是正确的回答问题
对于面试中遇到的大多数问题,都能有一个合理的思考路径
让大家在面对面试中的算法问题时,有一个合理的思考路径:
不代表能够“正确”回答每一个算法问题,但是合理的思考方向其实更重要,也是正确完成算法面试问题的前提
算法面试优秀不意味着技术面试优秀
技术面试优秀不意味着能够拿到Offer
算法面试的目的不是给出一个“正确”答案,
而是展示给面试官你思考问题的方式。
算法面试不是高考。
把这个过程看作是和面试官一起探讨一个问题的解决方案。
对于问题的细节和应用环境,可以和面试官沟通。
这种沟通本身很重要,它暗示着你思考问题的方式。
我们需要对一组数据进行排序
设计排序接口,标准库的设计,业务中排序算法。
排序是基础操作,很重要。
解决
快速排序算法:O(nlogn)
忽略了算法使用的基础环境。要动态选择。
(向面试官提问):这组数据有什么样的特征?
有没有可能包含有大量重复的元素?
如果有这种可能的话,三路快排是更好地选择。
普通数据:普通快速排序就行了;java语言标准库排序使用的三路快排。
是否大部分数据距离它正确的位置很近?是否近乎有序?
如果是这样的话,插入排序是更好地选择。
按照业务发生顺序,先发生先完成,几乎有序,插入排序是更好的选择。
是否数据的取值范围非常有限?比如对学生成绩排序。
如果是这样的话,计数排序是更好地选择。高考成绩取值范围有限:计数排序更好。
(向面试官提问):对排序有什么额外的要求?
是否需要稳定排序?
如果是的话,归并排序是更好地选择。
(向面试官提问):数据的存储状况是怎样的?
是否是使用链表存储的?
如果是的话,归并排序是更好地选择。
快排依赖于数组的随机存取。
(向面试官提问):数据的存储状况是怎样的?
数据的大小是否可以装载在内存里?
数据量很大,或者内存很小,不足以装载在内存里,需要使用外排序算法。
有没有可能包含有大量重复的元素?
是否大部分数据距离它正确的位置很近?是否近乎有序?
是否数据的取值范围非常有限?比如对学生成绩排序。
是否需要稳定排序?
是否是使用链表存储的?
数据的大小是否可以装载在内存里?
正确除了你能把代码编出来运行出正确的结果。正确还包含对问题的独到见解;优化;代码规范;容错性;
o 不仅仅是给出解决算法问题的代码,还要把上面因素包括。
o 如果是非常难的问题,对你的竞争对手来说,也是难的。
关键在于你所表达出的解决问题的思路。
甚至通过表达解题思路的方向,得出结论:这个问题的解决方案,应该在哪一个领域,我可以通过查阅或者进一步学习解决问题。
算法面试只是面试的一部分
算法面试只是技术面试的一部分。
根据你的简历和应聘职位的不同,势必要考察其他技术方面。
项目经历和项目中遇到的实际问题
o 解决能力,是否参与
o 深入思考
o 技术态度
面试前梳理自己简历上所写到的项目:整理一下可能会问到的。
你遇到的印象最深的bug是什么?
面向对象
设计模式
网络相关;安全相关;内存相关;并发相关;…
系统设计;scalability(大规模)
技术面试只是面试的一部分。面试不仅仅是考察你的技术水平,还是了解你的过去以及形成的思考行为方式。
关于过去:参与项目至关重要
工作人士
研究生
本科生
o 毕业设计
o 其他课程设计(大作业)
实习
创建自己的项目
o 自己做小应用:计划表;备忘录;播放器…
o 自己解决小问题:爬虫;数据分析;词频统计...
o “不是项目”的项目:一本优秀的技术书籍的代码整理等…(github)
o 分享:自己的技术博客;github等等
通过过去了解你的思考行为方式:
遇到的最大的挑战?
犯过的错误?
遭遇的失败?
最享受的工作内容?
遇到冲突的处理方式?
做的最与众不同的事儿?
具体阐述:我在某某项目中遇到一个怎样的算法问题:这个问题是怎样的。它是我遇到的最大的挑战,我是如何克服解决的。
整个小组的大概运行模式是怎样的?
整个项目的后续规划是如何的?
这个产品中的某个问题是如何解决的?
为什么会选择某些技术?标准?
我对某个技术很感兴趣,在你的小组中我会有怎样的机会深入这种技术?
算法面试仍然是非常重要的一部分
如何准备算法面试
准备面试和准备算法面试是两个概念
算法面试,只是面试中的一个环节。
远远不需要啃完一本《算法导论》
o 强调理论证明
o 第一遍读不需要弄懂证明
o 前几遍阅读应该记住结论就行了,不需要弄懂证明。把更多的精力放在算法思想上。
针对算法面试,算法导论里面的理论推导和证明不是很重要的方面。
选择合适的oj
leetcode
o Online Portal for IT Interview
o 真实的面试问题
o http://www.leetcode.com
HankeRank
o 特点是对于问题的分类很详细。偏难,不过可以对某一类细分问题解决。
o http://www.hackerrank.com
在学习和实践做题之间,要掌握平衡
基础算法实现与算法思想
如何回答算法面试问题
注意题目中的条件
o 给定一个有序数组...(二分法)
有一些题目中的条件本质是暗示
o 设计一个O(nlogn)的算法(分治:在一颗搜索树中完成任务,对于数据排序)
o 无需考虑额外的空间(用空间换时间上的优化)
o 数据规模大概是10000(O(n^2)就可以)
当没有思路的时候
自己给自己几个简单的测试用例,试验一下
不要忽视暴力解法。暴力解法通常是思考的起点。
例子
LeetCode 3 LongestSubstringWithout Repeating Characters
在一个字符串中寻找没有重复字母的最长子串
如”abcabcbb”,则结果为”abc”
如”bbbbb”,则结果为”b”
对于字符串s的子串s[i...j]
使用O(n^2)的算法遍历i,j,可以得到所有的子串s[i...j]
使用O(length(s[i...j]))的算法判断s[i...j]中是否含有重复字母
三重循环:复杂度O(n^3),对于n=100的数据,可行
遍历常见的算法思路
遍历常见的数据结构
空间和时间的交换(哈希表)
预处理信息(排序)
在瓶颈处寻找答案:O(nlogn)+ O(n^2); O(n^3)
o O(n^2)能否优化。
什么样的问题使用什么样的思路和数据结构。
极端条件的判断
o 数组为空?
o 字符串为空?
o 数量为0?
o 指针为NULL?
代码规范:
o 变量名
o 模块化
o 复用性
‘贰’ 知名公司经典算法笔试题和面试题答案
微软
有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
给出一个函数来输出一个字符串的所有排列。
请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
怎样编写一个程序,把一个有序整数数组放到二叉树中?
怎样从顶部开始逐层打印二叉树结点数据?请编程。
怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?
请编写能直接实现int atoi(const char * pstr)函数功能的代码。
编程实现两个正整数的除法,编程实现两个正整数的除法,当然不能用除法操作符。
1
// return x/y.
2
int span(const int x, const int y)
3
{
4
....
5
}
在排序数组中,找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。
平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。
一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意:
5个数值允许是乱序的。比如:8 7 5 0 6
0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4
0可以多次出现。
复杂度如果是O(n2)则不得分。
设计一个算法,找出二叉树上任意两个结点的最近共同父结点。复杂度如果是O(n2)则不得分。
一棵排序二叉树,令 f=(最大值+最小值)/2,设计一个算法,找出距离f值最近、大于f值的结点。复杂度如果是O(n2)则不得分。
一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。复杂度最好是O(n),如果是O(n2)则不得分。
Google
正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1)、设计一个函数void generate(int a,int b,int N ,int * Q)计算Q的前几项(2)、设计测试数据来验证函数程序在各种输入下的正确性。
有一个由大小写组成的字符串,现在需要对他进行修改,将其中的所有小写字母排在答谢字母的前面(大写或小写字母之间不要求保持原来次序),如有可能尽量选择时间和空间效率高的算法 c语言函数原型void proc(char *str) 也可以采用你自己熟悉的语言。
如何随机选取1000个关键字,给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字?
判断一个自然数是否是某个数的平方。说明:当然不能使用开方运算。
给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数。
1024! 末尾有多少个0?
有5个海盗,按照等级从5到1排列,最大的海盗有权提议他们如何分享100枚金币。但其他人要对此表决,如果多数反对,那他就会被杀死。他应该提出怎样的方案,既让自己拿到尽可能多的金币又不会被杀死?(提示:有一个海盗能拿到98%的金币)
23、Google2015华南地区笔试题。给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。比如,A=[1,0] K=21 那么输出结构应该为100。
网络
用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。
用C语言实现函数void * memmove(void *dest, const void *src, size_t n)。memmove 函数的功能是拷贝src所指的内存内容前n个字节到dest所指的地址上。分析:由于可以把任何类型的指针赋给void类型的指针,这个函数主要是实现各种数据类型的拷贝。
有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
腾讯
请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
两个数相乘,小数点后位数没有限制,请写一个高精度算法
有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?
有12个小球,外形相同,其中一个小球的质量与其他11个不同,给一个天平,问如何用3次把这个小球找出来,并且求出这个小球是比其他的轻还是重
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数。
腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并打印出来。 1 2
‘叁’ 2019人人网算法类笔试题和面试题答案汇总
如下为大家汇总的内容是人人网算法类笔试题,感兴趣的朋友可以练习下。
1.给出一个有序数组啊,长度为len,另外给出第三个数X,问是否能在数组中找到两个数,这两个数之和等于第三个数X。
我们首先看到第一句话,这个数组是有序的,所以,我们可以定义两个指针,一个指向数组的第一个元素,另一个指向应该指向的位置(这个需要看具体的实现和数组给定的值),首先计算两个位置的和是否等于给定的第三个数,如果等于则算法结束,如果大于,则尾指针向头指针方向移动,如果小于,则头指针向尾指针方向移动,当头指针大于等于尾指针时算法结束,没有找到这样的两个数。
解法一:
#include
int judge(int *a, int len, int k, int *num1, int *num2);
int main(int argc, char **argv)
{
int test_array[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
int result = -1;
int num1, num2;
result = judge(test_array, sizeof(test_array) / sizeof(int), 12, &num1, &num2);
if(result == 0)
{
printf("%d %d ", num1, num2);
}
else if(result == -1)
{
printf("can't find");
}
else
{
printf("error");
}
}
int judge(int *a, int len, int k, int *num1, int *num2)
{
int *low = NULL;
int *high = NULL;
int i = 0;
int result = -1;
if(a == NULL || len < 2)
{
return result;
}
if(a[0] >= k)
{
return result;
}
while(a[i] <= k && i < len)
{
i++;
}
low = a;
high = a + i - 1;
while(low < high)
{
*num1 = *low;
*num2 = *high;
if((*low + *high) == k)
{
result = 0;
break;
}
else if((*low + *high) > k)
{
high--;
}
else if((*low + *high) < k)
{
low++;
}
}
return result;
}
解法二:
#include
using namespace std;
int hash_table[100];
bool judge(int *a, int len, int x)
{
memset(hash_table, 0, sizeof(hash_table));
for (int i=0; i
{
hash_table[x - a[i]] = 1;
}
for (int i=0; i
{
if (hash_table[i] == 1)
{
return true;
}
}
return false;
}
int main()
{
int len = 10;
int a[10] = {1, 3, 5, 7, 9, 4, 2, 8, 10, 6};
int x = 19;
if (judge(a, len, x))
{
cout<<"Yes"<
}
else
{
cout<<"No"<
}
system("pause");
return 0;
}
本题解决方法:hash table。
时间复杂度:O(N)
空间复杂度:O(N)
2.给定有n个数的数组a,其中有超过一半的数为一个定值,在不进行排序,不开设额外数组的情况下,以最高效的算法找出这个数。
int find(int* a, int n);
#include
using namespace std;
int find(int *a, int n)
{
int t = a[0];
int count = 0;
for (int i=0; i
{
if (count == 0)
{
t = a[i];
count = 1;
continue;
}
else
{
if (a[i] == t)
{
count++;
}
else
{
count--;
}
}
}
return t;
}
int main()
{
int n = 10;
int a[10] = {1, 3, 2, 3, 3, 4, 3, 3, 3, 6};
cout<
system("pause");
return 0;
}
Time Complexity: O(n)
Space Complexity:O(1) 更多热门的笔试题目推荐:
中国人民银行的笔试题
上海东方传媒集团笔试题
广东北电研发工程师笔试题
金融投资顾问常考笔试题目
‘肆’ 示知一下九章算法面试高频题冲刺班2021怎么样 值得学吗
我学了,课程很不错!而且花了不到一折的价格!我是在共众号< 阿宁宝库> 领取的,真的是白菜价,省了不少!,你也可以关注共众号< 阿宁宝库>会给你惊喜的....你也可以网络下。
‘伍’ 经典笔试面试知识整理,数据结构与算法(代码演示)
题目描述:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入描述: array: 待查找的二维数组 target:查找的数字
输出描述:
查找到返回true,查找不到返回false
题目描述:
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
题目描述: 输入一个链表,从尾到头打印链表每个节点的值。
输入描述: 输入为链表的表头
输出描述: 输出为需要打印的“新链表”的表头
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
1、题目描述:
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39
2、题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
3、题目描述:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
4、题目描述:
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
1、题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
2、题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作, 队列中的元素为int类型。
题目描述:
输入一个链表,输出该链表中倒数第k个结点。
‘陆’ 小象学院的bat面试算法课程怎么样
小象学院太坑!!!!!!花了400多,没时间看,等有时间看的时候,告诉你课程过期要续费,资料页下载不了了!!!而且即使是续费,也不是永久,还是只能看一年!!!365天后和课程永远拜拜,并且没地儿说理去!!!!
‘柒’ 大公司笔试面试有哪些经典算法题目
1、二维数组中的查找
具体例题:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列?
‘捌’ acwing里的yxc是谁
acwing里的yxc是闫学灿。
yxc北京大学 本名闫学灿,2011年获得NOI金牌,并保送北京大学计算机系。2018年初创办AcWing算法交流平台。
AcWing的创始人就是闫学灿。AcWing,北京睿新奇知科技有限公司旗下品牌,拥有算法系列精品课程-AcWing 算法全家桶,配备全面系统的知识讲解,配套题库的实战训练,专业在线的答疑辅导。
品牌理念
致力于帮助同学们从新手小白开始,用系统的学习方式成长为算法大佬。
产品系列
语法基础课、算法基础课、算法提高课、算法进阶课、考研算法辅导课、蓝桥杯C++AB组辅导课、CCF-CSP认证辅导课、PAT甲级辅导课、CSP-J(NOIP普及组)辅导课、USACO Training辅导课、算法笔试面试辅导课等针对性训练课程。
以上内容参考网络-AcWing
‘玖’ 算法岗面试指南(上)
无论是春招还是秋招,应届还是在职的从业人员,我们在面试算法总会被问到一些基本功。如果你还在四处贴吧博客论坛寻找面经的话,不妨可以看看我整理的内容,一次性解决你的面试难题!
首先来看机器学习方面,我整理了一份长达60页的word文档,共分为13个模块。收集了最常见的机器学习问题以及解答。
目录内容非常多,无法一一展示。
监督学习、无监督学习、概率模型、偏差方差....这些你都能掌握吗?
对常见的机器学习算法进行梳理与归纳,在面试前看一看事半功倍。
当然也有大家最头痛的数学原理推导的内容。
只要你认认真真看完,找一份好的算法岗位工作肯定是不成问题。
当然这份资料不是free的,但是可以放心只收取一点辛苦整理费。看过我专栏文章的都应该也清楚其中的质量。
我的朋友,五十rm b不到可以为你打开一扇大门何乐而不为呢?有需要的同学可以直接私聊,有在就会回复~