1. 算法面试
我在《再谈“我是怎么招程序员”》中比较保守地说过,“问难的算法题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试算法题的目的。”,今天,我想加强一下这个观点——我反对纯算法题面试!(注意,我说的是纯算法题)图片源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,和一个商品名,系统告诉我应该订多少价?(商家的所有商品的报价在一数组中)”——业务分析,整体性能,算法,数据结构,增加需求让应聘者重构,这一个问题就全考了。你是不是在说算法不重要,不用学?千万别这样理解我,搞得好像如果面试不面,我就可以不学。算法很重要,算法题能锻炼我们的思维,而且也有很多实际用处。我这篇文章不是让大家不要去学算法,这是完全错误的,我是让大家带着业务问题去使用算法。问你业务问题,一样会问到算法题上来。小结看过这上面的分析,我相信你明白我为什么反对纯算法面试题了。原因就是纯算法的面试题根本不能反应一个程序的综合素质!那么,在面试中,我们应该要考量程序员的那些综合素质呢?我以为有下面这些东西:会不会做需求分析?怎么理解问题的?解决问题的思路是什么?想法如何?会不会对基础的算法和数据结构灵活运用?另外,我们知道,对于软件开发来说,在工程上,难是的下面是这些挑战:软件的维护成本远远大于软件的开发成本。软件的质量变得越来越重要,所以,测试工作也变得越来越重要。软件的需求总是在变的,软件的需求总是一点一点往上加的。程序中大量的代码都是在处理一些错误的或是不正常的流程。所以,对于编程能力上,我们应该主要考量程序员的如下能力:设计是否满足对需求的理解,并可以应对可能出现的需求变化。
2. 几千万个数中找出最大的十个数,求算法大神讲下方法 应该是一道面试题,麻烦讲下大概思路
采用一个最小堆的结构,数目为10.
初始值为这几千万个数前10个数,依次遍历这几千万个数,每遍历一个数就和最小堆的最小值比较,如果大的话就插入该最小堆中,并删除最小元素.直至遍历完毕.
算法复杂度为O(n),因为log10是个常数.
3. java算法题。小菜鸟的大问题。面试题。
帮你写出来了:用欧几里得最大公约数算法,然后判断:
如果分子>=分母或者gcd结果b值不是1就不是最简真分数,否则就是。
我这个用正则表达式先判断输入格式了。
---------------------------------------------------------------
importjava.util.regex.Pattern;
importjava.io.*;
publicclassDemo{
publicstaticvoidmain(Stringargs[])throwsIOException{
Patternregex=Pattern.compile("[0-9]*/[0-9]*");
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
Stringnum="";
while(!(num=br.readLine()).equals("-1")){
if(!regex.matcher(num).matches()){
System.out.println("格式不正确,请重新输入!");
continue;
}
inta=Integer.parseInt(num.substring(0,num.indexOf('/')));
intb=Integer.parseInt(num.substring(num.indexOf('/')+1));
if(a>=b||!isRelativelyPrime(a,b))
System.out.println(num+"不是最简真分数");
else
System.out.println(num+"是最简真分数");
}
}
(inta,intb){
inttmp=0;
while(a>0){
tmp=b%a;
b=a;
a=tmp;
}
if(b==1)
returntrue;
else
returnfalse;
}
}
-----------------------------运行结果-------------------------------
4. Java编程常见面试题目,要求正确答案
第一,谈谈final, finally, finalize的区别。
final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.ASP?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
第五,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
第六,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
第七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a > 0); // throws an AssertionError if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
Javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
第八,GC是什么? 为什么要有GC? (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String("xyz");创建了几个String Object?
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
第十,Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
第十二,sleep() 和 wait() 有什么区别? 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
第十三,Java有没有goto?
Goto?java中的保留字,现在没有在java中使用。
第十四,数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
第十七,给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, , DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
第十八,error和exception有什么区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
第十九,List, Set, Map是否继承自Collection接口?
List,Set是
Map不是。
第二十,abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
第二十三,启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
第二十四,构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
第二十五,是否可以继承String类?
String类是final类故不可以继承。
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
不能,一个对象的一个synchronized方法只能由一个线程访问。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
会执行,在return前执行。
第二十八,编程题: 用最有效率的方法算出2乘以8等于几?
有C背景的程序员特别喜欢问这种问题。
2 << 3
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,有相同的hash code。
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,编程题: 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式:
第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
第三十三 Hashtable和HashMap
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
5. 如何才算精通算法和数据结构
精通是你自己认为自己比大部分人都强了,你要知道别人在做什么,你都会了,你还有自己的经验和独到之处,就算是精通了
看看微软的面试题吧,问个简单问题,如何检测一个链表有环?
给你一个算法,你能否看出它是否足够优化,是否知道它的时间空间复杂度,给你一个实际问题,比如存储的价格和计算的价格,你能否给出最省钱的方案?
常用的算法,你是否能直接就写出来,比如让你排序你能不能直接就写出4-5种方案,说出每种的复杂度?
6. 两道分类算法的面试题,数据挖掘/机器学习相关,诚心求教!
两个最重要的属性应该是数据的维数和数据的相关性,因为一般来讲,数据的维数越多越好,数据的相关性越小越好。
应该选择第二个,因为测试耗时增加很小(从耗时单位可以看出),同时训练花费的时间减少了很多(缩小到1/10)
个人愚见,希望对你有帮助~~
7. 互联网公司最常见的算法面试题有哪些
很多人都搞不清辞职的流程方法,所以才会遇到这种尴尬的局面。
提出离职之前,应当先提出加薪申请。如果加薪通过,你继续安心干活,如果加薪申请被驳回,直接辞职信奉上,再也不要相信任何挽留的条件。
当然,你提出加薪申请的时候,千万不要流露出老子早找好下家了,不给加薪老子就炒你鱿鱼这样的表情,这对于谈判没什么帮助。多谈谈自己对公司的贡献,不要说公司之外的事情。 来自职Q用户:萝卜三人行
几乎必问排序,排序算法不下十种,不一定非要用快排,这种问题答的越多越好。 来自职Q用户:兔小灰
8. 进入IT企业必读的200个 .NET面试题的目 录
第1章 应聘开发职位的技巧和禁忌 1
程序员在准备面试的过程中,有时会过分注重技术上的准备工作,事实上,一些非技术的准备工作也相当重要。掌握好应聘技术职位过程中的软技巧、准备一份出色的简历、提高警惕避免在应聘中触犯一些禁忌,可以大大地提高面试的成功率。在开始面试时,还要把握一些强势的招聘网站,给自己一个展现自我的平台。本章从了解、准备、开始,层层渐进,让读者对整个程序员面试的过程有个全局性的掌握。
1.1 技术职位需要怎样的人才——了解大环境 1
1.1.1 对技术的执着和热情 1
1.1.2 对编程始终抱有认真的态度 1
1.1.3 实事求是的态度和谦逊的品质 1
1.1.4 适合应聘公司的文化 1
1.2 一份出色的个人简历——面试准备 2
1.2.1 一份简历不宜超过一页 2
1.2.2 永远准备中文简历 2
1.2.3 不要在个人简历上注明希望薪水 2
1.2.4 简历模板 2
1.3 展现自我——开始发简历 3
1.3.1 应聘渠道 3
1.3.2 应聘流程 7
1.4 真正的面试——开始面试 8
1.4.1 笔试 8
1.4.2 面试 10
1.4.3 电话面试 10
1.4.4 网络考试 10
1.5 面试中的一些禁忌 11
1.6 小结 12
第2章 .NET框架基础 13
本章覆盖了.NET面试笔试中常见的.NET框架技术题。此类题目侧重于考查应聘者对于.NET机制的深入了解,彻底理解.NET的运行机制,并且熟悉一个.NET系统常用的管理部署方法。
2.1 .NET基础概念 13
2.1.1 什么是CTS、CLS和CLR 13
2.1.2 开发和运行.NET程序需要的
最基本环境是什么 15
2.1.3 .NET是否支持多编程语言开发 15
2.1.4 CLR技术和COM技术的比较 17
2.1.5 什么是程序集和应用程序域 18
2.2 .NET运行机制 20
2.2.1 .NET程序被编译成什么形式的代码 20
2.2.2 JIT是如何工作的 22
2.2.3 简述程序集的加载机制 23
2.2.4 如何配置程序集的版本策略 25
2.3 生成、部署和管理 27
2.3.1 如何生成强签名的程序集 27
2.3.2 如何把程序集放入GAC中 29
2.3.3 延迟签名及其作用 30
2.3.4 程序集的版本分哪几部分 32
2.4 名企面试真题 32
2.5 小结 33
第3章 .NET类型语法基础 34
本章覆盖了.NET面试笔试中最基础的语法和类型题。纵观.NET的面试题,此类题目涉及了最基础的知识点,其难度也相对最小。但是应聘者如果对此类的面试题回答得不正确或者不完整,将会给面试官留下技术水平较差的印象,建议读者对本章的题目做到深刻理解和掌握。
3.1 基础类型和语法 34
3.1.1 .NET中所有内建类型的基类是什么 34
3.1.2 System.Object中包含哪些方法,哪些是虚方法 35
3.1.3 值类型和引用类型的区别 37
3.1.4 简述装箱和拆箱原理 40
3.1.5 C#中是否有全局变量 43
3.1.6 struct和class的区别,
struct适用哪些场合 43
3.1.7 类型的初始化器何时被调用 44
3.1.8 C#中方法的参数可以有哪几种传递方式 47
3.1.9 C#中string和String有什么区别 50
3.1.10 .NET支持哪几种可访问性级别,C#实现了其中的哪几种 50
3.1.11 简述属性的特点及属性和方法的异同 51
3.1.12 简述C#中的浅复制和深复制 54
3.1.13 简述C#中的循环语法和各自的特点 57
3.1.14 C#中的using语句有什么作用 60
3.2 内存管理和垃圾回收 62
3.2.1 简述.NET中堆栈和堆的特点和差异 62
3.2.2 执行string abc=aaa+bbb+ccc共分配了多少内存 64
3.2.3 .NET中GC的运行机制 66
3.2.4 Dispose方法和Finalize方法在何时被调用 67
3.2.5 GC中代(Generation)是什么,一共分几代 70
3.2.6 GC机制中如何判断一个对象是否仍在被使用 71
3.2.7 .NET的托管堆中是否可能出现内存泄漏现象 72
3.3 面向对象的实现 75
3.3.1 C#中类可以有多个父类、可以实现多个接口吗 75
3.3.2 简述C#中重写、重载和隐藏的概念 76
3.3.3 为什么在构造方法中调用虚方法会导致问题 78
3.3.4 在C#中如何声明一个类不能被继承 82
3.4 异常的处理 82
3.4.1 如何针对不同的异常进行捕捉 82
3.4.2 如何使用Conditional特性 84
3.4.3 如何避免类型转换时的异常 86
3.5 名企面试真题 88
3.6 小结 89
第4章 字符串、集合和流的使用 90
字符串、集合和流在程序中处理数据时经常被用到,这些代码的编写将直接影响到系统的正确性和效率。本章将包含关于字符串、集合和流的常见面试题,并且通过分析这些题目和知识点,帮助读者梳理这些方面的知识。
4.1 字符串处理 90
4.1.1 System.String是值类型还是引用类型 90
4.1.2 StringBuilder类型有何作用 91
4.1.3 如何在String和Byte[]对象之间进行转换 92
4.1.4 简述BASE64编码的作用以及C#中对其的支持 94
4.1.5 SecureString的实例如何被分配和释放 96
4.1.6 什么是字符串池机制 98
4.2 常用集合和泛型 99
4.2.1 Int[]是引用类型还是值类型 99
4.2.2 数组之间如何进行转换 100
4.2.3 解释泛型的基本原理 102
4.2.4 什么是泛型的主要约束和次要约束 104
4.2.5 .NET中是否可用标准模板库(STL) 105
4.3 流和序列化 106
4.3.1 什么是流,.NET中有哪些常见的流 106
4.3.2 如何使用压缩流 109
4.3.3 Serializable特性有何作用 111
4.3.4 .NET提供了哪几种可进行序列化操作的类型 113
4.3.5 如何自定义序列化和反序
列化的过程 116
4.4 名企面试真题 119
4.5 小结 119
第5章 常用类和接口 120
.NET除了提供运行引擎之外,还提供了丰富的内建类型。理解这些类型的作用和机制,能够帮助程序员减少代码工作,编写高效简洁的代码。而有时候误用类型,则会导致性能的降低,更严重时则会为系统带了潜伏的bug。本章将介绍一些经常出现在.NET面试中的类型和接口。
5.1 类型的基类System.Object 120
5.1.1 是否存在不继承自System.Object类型的类 120
5.1.2 在System.Object中定义的三个比较方法有何异同 122
5.1.3 如何重写GetHashCode方法 125
5.2 时间的操作System.DateTime 127
5.2.1 DateTime如何存储时间 127
5.2.2 如何在DateTime对象和
字符串对象之间进行转换 127
5.2.3 什么是UTC时间,如何转换到UTC时间 130
5.3 IFormattable和IformatProvider的使用 131
5.3.1 如何使用IFormattable接口实现格式化输出 131
5.3.2 如何告诉类型格式化输出的方式 133
5.4 管理文件和文件夹的类型 135
5.4.1 如何操作文件和文件夹 135
5.4.2 如何实现文件和文件夹的监控功能 139
5.5 .NET中的定时器 141
5.5.1 .NET提供了哪几个定时器类型 141
5.5.2 .NET的内建定时器类型
是否会发生回调方法重入 146
5.6 名企面试真题 151
5.7 小结 151
第6章 .NET中的高级特性 152
本章的内容覆盖了诸如委托、事件、反射和特性等.NET框架中的高级特性。对这些特性的掌握和成熟运用,往往成为.NET程序员从入门级进阶到中级的判断标准。也正因为如此,此类题目在.NET技术笔试、面试中被大量采用。读者在阅读本章时,应力求做到知其然更知其所以然,充分理解各种特性在.NET框架下是如何实现的,这样的设计如何提高了程序的灵活性和可扩展性。
6.1 委托 152
6.1.1 请解释委托的基本原理 152
6.1.2 委托回调静态方法和实例方法有何区别 154
6.1.3 什么是链式委托 154
6.1.4 链式委托的执行顺序是怎么样的 156
6.1.5 可否定义拥有返回值的方法的委托链 157
6.1.6 委托通常可以应用在哪些场合 159
6.2 事件 165
6.2.1 请解释事件的基本使用方法 165
6.2.2 事件和委托有何联系 167
6.2.3 如何设计一个带有很多事件的类型 169
6.2.4 用代码表示如下情景:猫叫、老鼠逃跑、主人惊醒 173
6.3 反射 175
6.3.1 请解释反射的基本原理和其实现的基石 176
6.3.2 .NET提供了哪些类型来实现反射 179
6.3.3 如何实现动态地发射程序集 184
6.3.4 如何利用反射来实现工厂模式 188
6.3.5 如何以较小的内存代价保存
Type、Field和Method信息 194
6.4 特性 196
6.4.1 什么是特性,如何自定义一个特性 196
6.4.2 .NET中特性可以在哪些元素上使用 198
6.4.3 有哪几种方法可以获知一个元素是否申明某个特性 200
6.4.4 一个元素是否可以重复申明同一个特性 202
6.5 名企面试真题 204
6.6 小结 204
第7章 .NET多线程编程 205
多线程编程是每个技术框架下都需要面对的问题,在多CPU、多核的硬件架构逐渐普及的今天,多线程编程也渐渐变得更加重要。本章将集中覆盖关于.NET中多线程编程的面试题。
7.1 多线程编程的基本概念 205
7.1.1 请解释操作系统层面上的线程和进程 205
7.1.2 多线程程序在操作系统里是并行执行的吗 206
7.1.3 什么是纤程 207
7.2 .NET中的多线程编程 208
7.2.1 如何在.NET程序中手动控制多个线程 208
7.2.2 如何使用.NET的线程池 212
7.2.3 如何查看和设置线程池的上下限 215
7.2.4 如何定义线程独享的全局数据 217
7.2.5 如何使用异步模式读取一个文件 221
7.2.6 如何阻止线程执行上下文的传递 223
7.3 多线程程序的线程同步 227
7.3.1 什么是同步块和同步块索引 227
7.3.2 C#中的lock关键字有何作用 229
7.3.3 可否使用值类型对象来
实现线程同步 232
7.3.4 可否对引用类型对象自身进行同步 233
7.3.5 什么是互斥体,Mutex类型和Monitor类型的功能有何区别 235
7.4 名企面试真题 238
7.5 小结 238
第8章 ASP NET应用开发 239
ASP NET是微软公司提供的编写动态网站的技术框架,其特点是基于.NET框架基础,所有ASP NET程序都可以使用针对.NET的语言编写。在微软公司的Visual Studio开发平台中,实现了拖放控件等便捷的功能,使得ASP NET应用程序的开发效率得到了较大的提高,近些年来ASP NET技术逐渐成为网站开发的主流技术之一,本章将覆盖一些常见的关于ASP NET开发的面试题。
8.1 ASP NET应用开发基础 239
8.1.1 请解释ASP NET以什么形式运行 239
8.1.2 常见的HTTP Code有哪些 242
8.1.3 GET请求和POST请求有何区别 245
8.1.4 介绍ASP NET的页面生存周期 247
8.2 控件和页面 249
8.2.1 什么是静态页面,什么是动态页面 250
8.2.2 请简述ViewState的功能和实现机制 251
8.2.3 Session有哪几种存储方式,之间有何区别,如何进行设置 255
8.2.4 如何嵌套使用GridView控件 259
8.2.5 列举几种实现页面跳转的方法,并说明其实现机制 263
8.2.6 请解释<%# Eval(source)%>的功能和实现机制 270
8.2.7 ObjectDataSource控件有何作用 273
8.3 验证和安全 277
8.3.1 如何使用正则表达式来验证一个
上海市电话号码 277
8.3.2 介绍ASP NET验证控件的功能和
使用方法 280
8.3.3 如何防止SQL注入式攻击 287
8.4 名企面试真题 289
8.5 小结 289
第9章 .NET中的数据库开发 290
大部分系统都会包含数据库应用。数据库应用设计往往成为系统设计中最重要的组成之一,这其中不止包括数据库的架构、库结构的设计,也包括了程序访问数据库策略的设计。在.NET的程序开发中,ADO NET已经成为访问数据库最主要的组件框架。本章将覆盖和数据库访问及ADO NET有关的常见面试题,具体会覆盖ADO NET基本概念、数据库的链接、数据库读写等主题。
9.1 ADO NET和数据库程序基础 290
9.1.1 什么是关系型数据库 290
9.1.2 如何通过SQL语句来实现行列转换 291
9.1.3 ADO NET支持哪几种数据源 293
9.2 ADO NET和数据库的连接 295
9.2.1 请简要叙述数据库连接池的机制 295
9.2.2 如何提高连接池内连接的重用率 298
9.2.3 一个连接字符串可以包含哪些属性 300
9.2.4 CommandBehavior.CloseConnection有何作用 302
9.3 使用ADO NET读写数据库 305
9.3.1 ADO NET支持哪两种方式来访问关系数据库 305
9.3.2 什么是强类型的DataSet 309
9.3.3 请解释SqlDataAdapter的
基本工作机制 312
9.3.4 如何自动生成SqlDataAdapter的
更新命令 316
9.3.5 如何实现批量更新的功能 319
9.4 名企面试真题 321
9.5 小结 321
第10章 XML的应用和处理 322
XML可算是近10年来最炙手可热的技术之一,由于其跨平台的特性,很多技术应用都选择基于XML来进行发展。在.NET中,对XML的支持和应用随处可见。例如配置文件的格式、数据结构的表示、Web Service应用等,都是以XML语法为基础的。本章将详细覆盖常见的关于XML本身及其在.NET中应用的面试题。
10.1 XML的基本特性 322
10.1.1 什么是XML 322
10.1.2 简述XML的常用领域及其优势 323
10.1.3 XML中<![CDATA[ ]]>标签的作用 324
10.1.4 XML规范是否允许空的属性值 325
10.1.5 XML中如何处理诸如“<”的字符 326
10.1.6 XML中的命名空间如何使用 328
10.2 使用.NET组件读写XML 330
10.2.1 .NET中操作XML的基本类型有哪些 330
10.2.2 如何使用XmlDocument类型操作XML文档的节点和属性 334
10.2.3 如何使用XPath来指向带有属性的节点 337
10.2.4 .NET中如何验证一个XML文档的格式 338
10.2.5 .NET中XML文档和关系模式如何转换 340
10.3 利用XSLT处理XML文档 344
10.3.1 什么是XSLT,XSLT有何作用 344
10.3.2 如何使用XSLT中的模板 346
10.3.3 如何在XSLT文档中调用
其他XSLT文档 349
10.3.4 如何在代码中使用XSLT文档 351
10.4 名企面试真题 353
10.5 小结 353
第11章 Web Service的开发与应用 354
Web Service是一种网络服务,形式非常类似于当前智能手机上的应用。通过通用的规范,Web Service技术允许使用者访问网络上每一个Web Service所提供的服务。在网络快速发展的今天,这种基于网络的分布式服务已经被广泛地应用。本章将讨论关于.NET中如何应用Web Service的面试题。
11.1 SOAP和Web Service的基础概念 354
11.1.1 请简述SOAP协议 354
11.1.2 什么是WSDL,它有何作用 356
11.1.3 Web Service中如何处理附件 357
11.2 使用.NET开发Web Service 360
11.2.1 如何在.NET中创建Web Service 360
11.2.2 WebMethod特性包含哪些属性,各有何用处 363
11.2.3 如何生成Web Service代理类型 367
11.2.4 请简述.NET中Web Service的异常机制 368
11.3 Web Service的安全机制 371
11.3.1 请简要介绍WS-Security的签名机制 371
11.3.2 WS-Security规范申明了哪几种身份验证的方法 373
11.4 名企面试真题 375
11.5 小结 375
第12章 .NET Remoting分布式应用开发 376
在企业级应用开发中,分布式开发占据了越来越重要的地位。.NET Remoting是一种可扩展性很高的分布式开发技术,相对于DCOM、CORBA、RMI等分布式开发技术而言,.NET Remoting拥有着众多独特的优势。.NET Remoting是一个庞大的技术话题,如果详细展开的话可能要占据一本书的篇幅。本章主要针对那些经常出现在.NET面试中的、与Remoting基础相关的面试题。
12.1 .NET Remoting框架基础 376
12.1.1 请简要介绍.NET Remoting的运行机制 376
12.1.2 请列举.NET Remoting机制中有哪些组件可以扩展替换 379
12.1.3 请简述.NET Remoting生存周期机制 384
12.2 使用.NET Remoting进行分布式应用开发 387
12.2.1 请介绍服务端激活模式和客户端激活模式的区别 387
12.2.2 请简述Remoting中有哪几种远程调用方式 390
12.2.3 Remoting机制中如何处理以ObjRef为参数的方法调用 393
12.2.4 请简述Remoting中配置文件的使用 397
12.2.5 如何在客户端和服务器端共享远程对象类型 400
12.3 名企面试真题 404
12.4 小结 404
第13章 代码和算法 405
无论是面试还是笔试,算法和代码的问题都是必不可少的,其区别仅在于笔试中更侧重于应聘者书写代码的能力,而面试中则更注重于应聘者的设计能力和算法思路。本章着重覆盖了一些在.NET面试中经常出现的和代码、算法有关的面试题,并且给出了解答思路和实现示例。
13.1 基础算法题 405
13.1.1 请实现一个快速排序算法 405
13.1.2 请实现一个二分查找算法 406
13.1.3 请实现一棵二叉树的中序、后序遍历 408
13.1.4 请写出一个奇偶分割算法 413
13.1.5 请实现一个简单的最短路径算法 414
13.2 程序设计题 423
13.2.1 请编程实现斐波拉契数列问题 423
13.2.2 请设计窗口程序演示八皇后问题 425
13.3 名企面试真题 432
13.4 小结 432
第14章 .NET中的单元测试 433
单元测试是软件开发中必不可少的一个环节,单元测试的优劣直接影响到集成测试、系统测试的效果,甚至会影响到最终产品的质量。大多数开发团队对单元测试非常重视,并且要求程序员掌握相应的知识。本章将覆盖在.NET面试中经常出现的关于单元测试的面试题。
14.1 单元测试基础概念 433
14.1.1 请简述单元测试的作用和其优点 433
14.1.2 请举例说明TDD开发方式的流程 434
14.1.3 请编写实现阶乘功能模块的测试用例 437
14.2 使用NUNIT进行单元测试 439
14.2.1 如何使用NUNIT来进行单元测试 439
14.2.2 如何对NUNIT的测试用例进行分类 442
14.2.3 请解释SetUp、TearDown、TestFixtureSetUp和
TestFixtureTearDown 446
14.3 名企面试真题 448
14.4 小结 448
9. 算法面试题 无序数组判断是否有重复数 面试题 时间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; //找到即退出
}
}
}
}
10. 数据分析常见面试题有哪些
1、如何理解过拟合?
过拟合和欠拟合一样,都是数据挖掘的基本概念。过拟合指的就是数据训练得太好,在实际的测试环境中可能会产生错误,所以适当的剪枝对数据挖掘算法来说也是很重要的。
欠拟合则是指机器学习得不充分,数据样本太少,不足以让机器形成自我认知。
2、为什么说朴素贝叶斯是“朴素”的?
朴素贝叶斯是一种简单但极为强大的预测建模算法。之所以称为朴素贝叶斯,是因为它假设每个输入变量是独立的。这是一个强硬的假设,实际情况并不一定,但是这项技术对于绝大部分的复杂问题仍然非常有效。
3、SVM 最重要的思想是什么?
SVM 计算的过程就是帮我们找到超平面的过程,它有个核心的概念叫:分类间隔。SVM 的目标就是找出所有分类间隔中最大的那个值对应的超平面。在数学上,这是一个凸优化问题。同样我们根据数据是否线性可分,把 SVM 分成硬间隔 SVM、软间隔 SVM 和非线性 SVM。
4、K-Means 和 KNN 算法的区别是什么?
首先,这两个算法解决的是数据挖掘中的两类问题。K-Means 是聚类算法,KNN 是分类算法。其次,这两个算法分别是两种不同的学习方式。K-Means 是非监督学习,也就是不需要事先给出分类标签,而 KNN 是有监督学习,需要我们给出训练数据的分类标识。最后,K 值的含义不同。K-Means 中的 K 值代表 K 类。KNN 中的 K 值代表 K 个最接近的邻居。