当前位置:首页 » 操作系统 » 面试算法100题

面试算法100题

发布时间: 2022-06-11 14:07:15

1. 面试中的计算题

算题者自己搞糊涂了,犯了逻辑上的错误。其实,根本就不存在少了10美元的问题。错误在于,说每个人实际交了90美元,共收3×90=270美元,这是对的,但不用这270美元去加20美元,而应加退给他们的30美元,正好等于300美元。因为人家交的270美元中,被服务员拿了20美元,这20美元就在270美元里面,怎么还能去和270美元相加呢?如果20美元要加,只能与经理那里的250美元相加,再加退给三人的30美元,总计300美元。这个问题实际上是个数学问题,也是个逻辑问题。

2. java面试算法题求解

看了两行看不下去了,吐槽一下。
现在某些小公司的面试官,面试题花式秀智商,一副全世界都求着他赐予工作的样子。

3. 如何准备互联网公司面试(算法相关)

书籍: 《算法导论》 这本是大部头,很多人都看不完。我本人也并没有看完,它跟了我这么多年,完全是属于常看常新的牛书。每一次看,都发现会有新的收获。比如,以前并不知道求K位数或者中位数有平均为O(n)复杂度的算法。看到了别的地方的参考资料,才知道,原来《算导》上专门有一小节讲这个内容。我基本上是本科比较集中的看了一遍,研一的时候又集中的看了一遍,才算是粗略的看完。但是其实,很多理论性的,以及图论一部分依然还是没有看完。个人推荐,先从简单的开始,挑选比较熟悉的一些偏重与数据结构方面的知识作为起点。这本书的习题非常重要,要是有时间,能够全部做完,那绝对是能够神功在手了。其实,集中把,第二部分(排序),第三部分(数据结构),第四部分(高级设计,我基本主要看动态规划和贪心),第五部分(高级数据结构,B树和二项堆,并差集),第六部分(图算法,最大流部分较难,自己可以看情况掌握)。这些部分可以先从算法本身开始,伪代码全部看懂。因为算法导论讲的很详细,而且有来龙去脉,基本不会有太大难度。数学证明,推荐大家掌握,但是,突击或者第一次,可以选择性的看看。我自己是重复看,才把证明看掉的。第一次看的时候,基本都跳过了。不过,证明和习题是精髓!希望如果有时间,一定要补回来。 《编程之美》《挑战编程》 这本书绝对是将全中国企业,或者说是一部分懒惰的企业面试题库提升了一个档次的一本神书。网络面我师兄的时候,我师兄直接把有一道题的最优解答出来了。但是,那个面试官显然是不知道最优解,一直在引导我师兄答出,这本书里面的第四个解。呵呵。书很不错。全部看一遍并不难。说个不好听的,可以背下来,而且相信我,基本上绝对有用!比如说,n!后面有多少个0。我相信,你们今年面试或者笔试,一定会碰到这道题。《挑战编程》大家可以自行考虑一下吧,这个完全是针对acm竞赛的,不过,看看题也不错。 《编程珠玑》 业界神书嘛。习题全部做完就是了。其实都是些小东西,但是,基本上一步步考察你的解决问题的能力。个人觉得,最常用的就是bit map做排序或者去重,拓展一下就是bloom filter,我当时都是在这本书里面看到的。 《算法技术手册》 这本书貌似出镜不多。书很薄,代码写的非常好,其实基本上全部都是基础算法和数据结构的实现。但是,它牛逼就在于,代码写的太好了,基本上,看一遍,绝对能背下来。面试基础很重要。基本上每个笔试或者面试,都会考一个100行以内的小程序。比如,给定一棵树,以及其中一个节点x,要求出这棵树的中序遍历序列中,x的后续节点,非递归实现。这种题非常简单,但是,真正写对的,其实并不多。《STL源码剖析》《C标准库》 都不厚。挑着看一遍非常舒服。特别是,看看STL每个数据结构迭代器类型啊,红黑书如何实现啊。C标准库,最常见的,比如strcpy()和memcpy()有什么区别啊。特别是,STL,看过之后,对泛型还是能有一定了解的。《C专家编程》《Effective c++》《深度探索C++对象模型》 第一本比较简单,可以当八卦书看。后两本其实也没啥好说的,其实都是些业界公认的牛书。我再重复一遍也没什么意义。但是,的确,考察基本上也就都是这么几本书上面的东西。基本上后两本主要侧重看c++对象方面的一些指示,特别是多态相关的。 《具体数学》《组合数学》 这两本其实可以看作修身养性的书。我当时是时间比较充裕的时候看完的。纯突击,大家就可以跳过了。但是,看完真的很有用。比如说,你们就可以跟面试官扯约瑟夫环的构造解了(这道题我觉得80%会遇到),直接推推公式,就不用写模拟代码了。《组合数学》也是,很多笔试一般会有些小智力题。不过,其实一般的题目,不看这本书也可以搞定。所以,这两本仅供参考。大家有兴趣的时候,可以翻翻。《Linux内核源码剖析》《Linux环境高级编程》…… 要是有机会,能看看最好。因为很多公司都会考察Linux相关的知识。最少要会点脚本,一些简单的Linux命令,以及正则表达式什么的。要是能聊聊内核源码或者驱动开发什么的东西,面试官肯定更加喜欢了。 知识: c & c++ 首先要知道c和c++的区别。常考的有const的用法,一些生僻关键字比如extern,static的用法。 结构体与类的差别。类里面的字对齐问题,也就是说一个类到底有多大。以及一个空的类有多大。 虚函数以及多态相关的显然是重点。比如析构函数什么时候需要写成虚函数,构造函数是否可以是虚函数。 int a[10]; a 和 &a的区别。 java java我并不熟。但是基本上肯定会考一些虚拟机相关的,以及GC等知识。然后,一般招聘的java程序员都会问到很多多线程编程的东西,以及hadoop!这个绝对是重点,淘宝绝对就是问这个的。 操作系统 这个看工作岗位的实际要求。基本的进程线程区别==肯定是会问到的。要是要求高一些,就会问很多多线程编程的问题。一些竞争死锁等基础知识,一些进程调度的算法,最近的kernel好像用的是CFS调度算法。shell编程,如何读取程序堆栈,写一些core mp的读取程序等等的。 数据结构 基本上所有的排序都要会写。与树有关的操作都要会些非递归版本。图一般考的不多。Flood-Fill算法等等。查找中位数。B树和红黑书最好要掌握,不用会写,能扯扯基本就行。KMP,这个很有可能考!而且的确真的不好懂。要是实在不行,背下来吧。哈哈。 网络 这个其实比较基础了。我个人网络方面的知识并不好。但是各种协议的基础,几次握手啊,一些操作系统的api实现到底是单工还是双工用的是TCP还是UDP。我个人网络纯粹靠拼RP。 数据库 数据库非常重要。基本的SQL肯定是要会的。最常见有一道题,inner join和out join的区别。MySQL是重点,基本上很多企业都是问这个。然后,网络扯多了会跟你扯MySQL引擎 的一些东西。这些我就不太懂了。要是能准备的话,或者说的确是做这方面的,就可以着重多准备下。 大规模数据处理这一块绝对是重点!而且本身不是一个系统的学科分支。但是,基本上几家大公司都会问这方面的。推荐先读读google那几篇论文。Page Rank那一篇,然后Map Rece好像有几篇吧。Big Table什么的。推荐一个网址。这篇貌似是转载的,我以前找到的源地址现在找不到了。处理这一类问题基本上思路都是,哈希,map rece以及bit map等等的。对了,推荐看一下外排序以及相关的败者树。这些都是大规模数据处理的一些典型问题。掌握了这些其实也就够了。这块有点屠龙之技的感觉,特别是对于学生,基本没有谁能有机会把这些代码实现出来。但是,没办法,这些公司就是喜欢考。看完那篇博客的,然后再自行查找一些资料,基本就够了。万变不离其中,而且,这些东西,没办法考那么难的。 推荐一个博客吧,作者收集了100+道面试题,并且全部给出了代码。把这个全部看完,基本上很多面试笔试,都是这些原题。 推荐Top Language里面的今天我们思考系列,好几年前的了。看大牛的思考过程,非常有帮助。希望自己能多想想再看答案。注意,google group好像有时被墙。 我把发芽网的题库版块也扫了一遍。 还有好多一时想不起来了。

4. 算法面试

我在《再谈“我是怎么招程序员”》中比较保守地说过,“问难的算法题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试算法题的目的。”,今天,我想加强一下这个观点——我反对纯算法题面试!(注意,我说的是纯算法题)图片源Wikipedia(点击图片查看词条)我再次引用我以前的一个观点——能解算法题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就能解决实际问题。好了,让我们来看一个示例(这个示例是昨天在微博上的一个讨论),这个题是——“找出无序数组中第2大的数”,几乎所有的人都用了O(n)的算法,我相信对于我们这些应试教育出来的人来说,不用排序用O(n)算法是很正常的事,连我都不由自主地认为O(n)算法是这个题的标准答案。我们太习惯于标准答案了,这是我国教育最悲哀的地方。(广义的洗脑就是让你的意识依赖于某个标准答案,然后通过给你标准答案让你不会思考而控制你)功能性需求分析试想,如果我们在实际工作中得到这样一个题 我们会怎么做?我一定会分析这个需求,因为我害怕需求未来会改变,今天你叫我找一个第2大的数,明天你找我找一个第4大的数,后天叫我找一个第100大的数,我不搞死了。需求变化是很正常的事。分析完这个需求后,我会很自然地去写找第K大数的算法——难度一下子就增大了。很多人会以为找第K大的需求是一种“过早扩展”的思路,不是这样的,我相信我们在实际编码中写过太多这样的程序了,你一定不会设计出这样的函数接口 —— Find2ndMaxNum(int* array, int len),就好像你不会设计出 DestroyBaghdad(); 这样的接口,而是设计一个DestoryCity( City& ); 的接口,而把Baghdad当成参数传进去!所以,你应该是声明一个叫FindKthMaxNum(int* array, int len, int kth),把2当成参数传进去。这是最基本的编程方法,用数学的话来说,叫代数!最简单的需求分析方法就是把需求翻译成函数名,然后看看是这个接口不是很二?!(注:不要纠结于FindMaxNum()或FindMinNum(),因为这两个函数名的业务意义很清楚了,不像Find2ndMaxNum()那么二)非功能性需求分析性能之类的东西从来都是非功能性需求,对于算法题,我们太喜欢研究算法题的空间和时间复杂度了。我们希望做到空间和时间双丰收,这是算法学术界的风格。所以,习惯于标准答案的我们已经失去思考的能力,只会机械地思考算法之内的性能,而忽略了算法之外的性能。如果题目是——“从无序数组中找到第K个最大的数”,那么,我们一定会去思考用O(n)的线性算法找出第K个数。事实上,也有线性算法——STL中可以用nth_element求得类似的第n大的数,其利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:1)Sa中元素的个数小于k,则Sb中的第 k-|Sa|个元素即为第k大数;2) Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)。搞学术的nuts们到了这一步一定会欢呼胜利!但是他们哪里能想得到性能的需求分析也是来源自业务的!我们一说性能,基本上是个人都会问,请求量有多大?如果我们的FindKthMaxNum()的请求量是m次,那么你的这个每次都要O(n)复杂度的算法得到的效果就是O(n*m),这一点,是书呆子式的学院派人永远想不到的。因为应试教育让我们不会从实际思考了。工程式的解法根据上面的需求分析,有软件工程经验的人的解法通常会这样:1)把数组排序,从大到小。2)于是你要第k大的数,就直接访问 array[k]。排序只需要一次,O(n*log(n)),然后,接下来的m次对FindKthMaxNum()的调用全是O(1)的,整体复杂度反而成了线性的。其实,上述的还不是工程式的最好的解法,因为,在业务中,那数组中的数据可能会是会变化的,所以,如果是用数组排序的话,有数据的改动会让我重新排序,这个太耗性能了,如果实际情况中会有很多的插入或删除操作,那么可以考虑使用B+树。工程式的解法有以下特点:1)很方便扩展,因为数据排好序了,你还可以方便地支持各种需求,如从第k1大到k2大的数据(那些学院派写出来的代码在拿到这个需求时又开始挠头苦想了)2)规整的数据会简化整体的算法复杂度,从而整体性能会更好。(公欲善其事,必先利其器)3)代码变得清晰,易懂,易维护!(学院派的和STL一样的近似O(n)复杂度的算法没人敢动)争论你可能会和我有以下争论,如果程序员做这个算法题用排序的方式,他一定不会像你想那么多。是的,你说得对。但是我想说,很多时候,我们直觉地思考,恰恰是正确的路。因为“排序”这个思路符合人类大脑处理问题的方式,而使用学院派的方式是反大脑直觉的。反大脑直觉的,通常意味着晦涩难懂,维护成本上升。就是一道面试题,我就是想测试一下你的算法技能,这也扯太多了。没问题,不过,我们要清楚我们是在招什么人?是一个只会写算法的人,还是一个会做软件的人?这个只有你自己最清楚。这个算法题太容易诱导到学院派的思路了。是的这道“找出第K大的数”,其实可以变换为更为业务一点的题目——“我要和别的商户竞价,我想排在所有竞争对手报价的第K名,请写一个程序,我输入K,和一个商品名,系统告诉我应该订多少价?(商家的所有商品的报价在一数组中)”——业务分析,整体性能,算法,数据结构,增加需求让应聘者重构,这一个问题就全考了。你是不是在说算法不重要,不用学?千万别这样理解我,搞得好像如果面试不面,我就可以不学。算法很重要,算法题能锻炼我们的思维,而且也有很多实际用处。我这篇文章不是让大家不要去学算法,这是完全错误的,我是让大家带着业务问题去使用算法。问你业务问题,一样会问到算法题上来。小结看过这上面的分析,我相信你明白我为什么反对纯算法面试题了。原因就是纯算法的面试题根本不能反应一个程序的综合素质!那么,在面试中,我们应该要考量程序员的那些综合素质呢?我以为有下面这些东西:会不会做需求分析?怎么理解问题的?解决问题的思路是什么?想法如何?会不会对基础的算法和数据结构灵活运用?另外,我们知道,对于软件开发来说,在工程上,难是的下面是这些挑战:软件的维护成本远远大于软件的开发成本。软件的质量变得越来越重要,所以,测试工作也变得越来越重要。软件的需求总是在变的,软件的需求总是一点一点往上加的。程序中大量的代码都是在处理一些错误的或是不正常的流程。所以,对于编程能力上,我们应该主要考量程序员的如下能力:设计是否满足对需求的理解,并可以应对可能出现的需求变化。

5. JAVA算法面试题:哪位高人会做

就把算法给你写一下:
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
for(int k = 1;k<=n;k++)
{
if(i==j || i==k || j==k)
continue;
else
System.out.println(i*100+j*10+k);

}

6. 算法面试题 无序数组判断是否有重复数 面试题 时间on 空间o1

//100万不是很大
import java.util.*;
public class Test{

public static void main(String[] args){

int[] a = new int[1000000];

for(int i = 0; i<1000000;i++){
a[i] = i+1; //从1--1000000没有重复的
}

a[355] = 100;//将第356个数改成100,这样就只有两个重复的数100

List list = new ArrayList();

for(int i = 0 ; i < 1000000;i++){
Integer temp = new Integer(a[i]);
if(!list.contains(temp)){
list.add(temp);
}else{
int j = list.indexOf(temp) ;//第一次出现
System.out.println("第"+(j+1)+"个数和第"+(i+1)+"个数重复为:"+temp);
break; //找到即退出
}
}

}
}

7. java 算法简单面试题:要源码!

package tv.bilibili;

import java.util.Scanner;
import java.util.regex.MatchResult;

public class test3 {
public static void main(String[] args) {
double price, money;
Scanner input = new Scanner(System.in);
System.out.println("请输入物品价格:");
price = input.nextDouble();// 接受输入数字
System.out.println("请输入支付金额:");
money = input.nextDouble();// 接受输入数字
if (price <= money) {

money = money - price;
int , wushi, ershi, shi, wu, yi, wujiao, yijiao;
= (int) (money / 100);
money = money - * 100;
wushi = (int) (money / 50);
money = money - wushi * 50;
ershi = (int) (money / 20);
money = money - ershi * 20;
shi = (int) (money / 10);
money = money - shi * 10;
wu = (int) (money / 5);
money = money - wu * 5;
yi = (int) (money / 1);
money = money - yi * 1;
wujiao = (int) (money / 0.5);
money = money - wujiao * 0.5;
yijiao = (int) (money / 0.1);
money = money - yijiao * 0.1;
System.out.println("主要支付给顾客100元:" + + "张;" + "50元:" + wushi
+ "张;" + "20元:" + ershi + "张;" + "10元:" + shi + "张;"
+ "5元:" + wu + "张;" + "1元:" + yi + "张;" + "5角:"
+ wujiao + "张;" + "1角:" + yijiao + "张;");
} else {
System.out.println("您所支付的金额不足!");
}
}
}

算是写完了,其实很简单自己不动手只会害了自己,既然选择这个,以后问问题不要直接求代码,而是求方法,不然你永远从事不了这一行

8. 大公司笔试面试有哪些经典算法题目

1、二维数组中的查找

具体例题:如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列?



9. 一道面试题,找出1-100中没有插入的两个数

恩 将下我的思路吧: (算法自己实现,不会再联系我):

假设这连个数是a和b:
1. 对数组中的98个元素,进行求和为c, a+b = 5050-c
2. 1到100求平方在求和,数组中98个元素求平方在求和,求差 a2+b2=...
3. 这就类似一个一元二次方程,在解方程就可以了

10. JAVA面试题求大神帮忙,给满分100分

1: D | javac 命令编译指定类和该类依赖的类。编译后的文件为二进制文件class
2:C
3:B
4:C | IOException,runtimeException 编译时不要求强行处理,只在运行期发生。IOException编译时强行要求处理,继承自Exception
5:B | Set无序队列,用get(index)游标无法获取
6:C
7:A | 不使用关键字相当于default
8:D | 二进制算法 11为 111 | 10 = 111(只要有一个是1就是1) 也就是11
9: C | ''表示字节char。"/u0020" 是Unico的空格编码
10:B

1、publicstaticObject[]arraySubtract(Object[]array1,Object[]array2){
ArrayList<Object>list=newArrayList<Object>();
//选出属于数组1但不属于数组2的元素
for(inti=0;i<array1.length;++i){
booleanbContained=false;
for(intj=0;j<array2.length;++j){
if(array1[i].equals(array2[j])){
bContained=true;
break;
}
}
if(!bContained){
list.add(array1[i]);
}
}

Objectres[]=newObject[list.size()];
for(inti=0;i<list.size();++i)
res[i]=list.get(i);
returnres;
}

2、
intcount(intn)
{
intresult=0;
for(inti=1;i<n;i++)
{
result+=i;
}
returnresult;
}
3、select*fromAwherenamein((name)>1)
热点内容
linux下载gcc 发布:2024-11-02 14:13:47 浏览:344
写算法交易 发布:2024-11-02 13:57:09 浏览:208
安卓怎么下载鸿蒙 发布:2024-11-02 13:36:13 浏览:663
加密狗rsa 发布:2024-11-02 13:20:44 浏览:560
实用java教程 发布:2024-11-02 13:07:39 浏览:930
ide文件夹 发布:2024-11-02 12:51:37 浏览:559
python中字典的用法 发布:2024-11-02 12:40:42 浏览:28
安卓怎么下载zine 发布:2024-11-02 12:40:38 浏览:793
深入理解java虚拟 发布:2024-11-02 12:40:36 浏览:557
延吉麻将源码 发布:2024-11-02 12:39:36 浏览:226