6.2 笔试真题 & 详解
第一部分 7道填空题:
1、IM的全称( ),最大的三个IM( )
2、请写出三个互联网的网址
3、今年上市的5家互联网企业( )
4、5、6、7全是行测题,逻辑推理型,不难。
第二部分 产品设计题
1、人人网想推出一个校园招聘系统,请设计一个企业用户的注册表单界面,并写出设计思路及理由。
2、画了一个人人网登陆的界面图,要找问题,并给出修正图。
第三部分 问答题
1、请比较拨号式电话与按键式电话的差异,请从多角度详细阐述。
2、假如你是人人音乐的产品经理,请给出3个你认为最重要的数据,并说明理由。
3、博客和微博有哪些不同点,请从多角度详细阐述。
4、假如有一个项目预定要在1个月内完成,结果一周之后,有一个技术人员病了,要住院3周,这时作为项目负责人的你会怎么办?
附加题
人人网要做一个在线电影购票系统,请尽你所能详细描述你的设计思路。
最后交卷的时候才知道要带简历过去,还好好心的监考人员说等我10分钟,让我去打印了一份。
真题2:一、 Java笔试题•单项选择题
1. Java是从(C)语言改进重新设计
A.Ada B.C++ C. Pascal D. BASIC
2. 下列语句哪一个正确(B)
A. Java程序经编译后会产生machinecode
B. Java程序经编译后会产生bytecode
C. Java程序经编译后会产生DLL
D.以上都不正确
3. 下列说法正确的有(C)
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名
C. constructor在一个对象被new时执行
D. 一个class只能定义一个constructor
4. 提取Java存取数据库能力的包是(A)
A.java.sqlB. java.awt C. java.lang D. java.swing
5. 下列运算符合法的是(A)
A. && B.<> C. if D. :=
6. 执行如下程序代码
a=0;c=0;
do{
--c;
a=a-1;
}while(a>0);
后,C的值是(C)
A. 0 B. 1C.-1 D. 死循环
7. 下列哪一种叙述是正确的(D)
A. abstract修饰符可修饰字段、方法和类
B. 抽象方法的body部分必须用一对大括号{}包住
C. 声明抽象方法,大括号可有可无
D. 声明抽象方法不可写出大括号
8. 下列语句正确的是(A)
A. 形式参数可被视为local variable
B. 形式参数可被字段修饰符修饰
C. 形式参数为方法被调用时,真正被传递的参数
D. 形式参数不可以是对象
9. 下列哪种说法是正确的(D)
A. 实例方法可直接调用超类的实例方法
B. 实例方法可直接调用超类的类方法
C. 实例方法可直接调用其他类的实例方法
D. 实例方法可直接调用本类的类方法
二、 Java笔试题•多项选择题
1. Java程序的种类有(BCD)
A.类(Class) B.Applet C. Application D. Servlet
2. 下列说法正确的有(BCD)
A. 环境变量可在编译source code时指定
B. 在编译程序时,所能指定的环境变量不包括class path
C. javac一次可同时编译数个java源文件
D. javac.exe能指定编译结果要置于哪个目录(directory)
3. 下列标识符不合法的有(ACD)
A.new B.$Usdollars C.1234 D. car.taxi
4. 下列说法错误的有(BCD)
A. 数组是一种对象
B. 数组属于一种原生类
C. int number=[]={31,23,33,43,35,63}
D. 数组的大小可以任意改变
5. 不能用来修饰interface的有(ACD)
A.privateB. public C. protected D. static
6. 下列正确的有(ACD)
A. call by value不会改变实际参数的数值
B. call by reference能改变实际参数的参考地址
C. call by reference不能改变实际参数的参考地址
D. call byreference能改变实际参数的内容
7. 下列说法错误的有(ACD)
A. 在类方法中可用this来调用本类的类方法
B. 在类方法中调用本类的类方法时可直接调用
C. 在类方法中只能调用本类中的类方法
D. 在类方法中绝对不能调用实例方法
8. 下列说法错误的有(ABC)
A. Java面向对象语言容许单独的过程和函数存在
B. Java面向对象语言容许单独的方法存在
C. Java语言中的方法属于类的成员(member)
D. Java语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同
9. 下列说法错误的有(BCD)
A. 能被java.exe成功运行的java.class文件必须有main()方法
B. J2SDK就是Java API
C. Appletviewer.exe可利用jar选项运行.jar文件
D. 能被Appletviewer成功运行的java.class文件必须有main()方法
三、 JAVA相关基础知识
1. 面向对象的特征有哪些方面
封装,抽象, 继承,多态
2. String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用 StringBuffer类. String 和StringBuffer的区别: JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类 提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用 StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
3. int和Integer有什么区别
Integer是int的封装类,里面有很多进行处理的静态方法, Integer是对象而int不是,内存的分配位置也不一样
4. String和StringBuffer的区别
在java中有3个类来负责字符的操作。
1.Character 是进行单个字符操作的,
2.String 对一串字符进行操作。不可变类。
3.StringBuffer 也是对一串字符进行操作,但是可变类。
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
StringBuffer:
是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
它只能通过构造函数来建立,
StringBuffer sb = new StringBuffer();
note:不能通过付值符号对他进行付值.
sb = "welcome to here!";//error
对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中付值的时候可以通过它的append方法.
sb.append("hello");
字符串连接操作中StringBuffer的效率要比String高:
总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高
5. 运行时异常与一般异常有何异同
Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
6. 说出ArrayList, Vector, LinkedList的存储性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
7. &和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,
8. HashMap和Hashtable的区别
Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。
也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。
9. final, finally, finalize的区别
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
10. sleep()和wait()的区别
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题
在java.lang.Thread类中,提供了sleep(),
而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程
sleep()可以将一个线程睡眠,参数可以指定一个时间。
而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。
wait有两种形式wait()和wait(milliseconds).
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
11. overload和override的区别,overloaded的方法是否可以改变返回值的类型
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
12. 排序都有哪几种方法?请列举,用java实现一个快速排序
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。
插入排序:包括直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。将n个元素的数列分为已有序和无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
冒泡排序 (BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数 放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最 后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第 二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
选择排序:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
13. 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通 常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象 为"不可达"时,GC就有责任回收这些内存空间。
可以。
程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
14. 是否可以从一个static方法内部发出对非static方法的调用?
不行,
可以这样理解
static修饰的方法可以直接用类名调用
非static修饰的方法必须用类new出对象才能调用
当我们用类名直接调用时,可能这个类的对象并没有new。
如果这时候static方法里调用非static的方法就会出现空指针异常,
当然这种错误编译时就不会通过
15. 同步和异步有何异同,在什么情况下分别使用它们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
16. String str = new String(“abc”)在内存中是怎么分配的?
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
17. String str1 = “abc”和String str1 = newString(“abc”);这两个的区别是什么?
String str1 ="abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一方面, 要注意: 我们在使用诸如Stringstr = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质,当String变量需要经常变换其值时,应 该考虑使用StringBuffer类,以提高程序效率。
四、 Android相关基础知识
1. Android dvm的进程和Linux的进程、应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
什么是android DVM:Dalvik是Google公司自己设计用于Android平台的Java虚拟机,每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Dalvik和Java运行环境的区别[
1:Dalvik主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
2:Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
3:不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex 4:dex文件格式可以减少整体文件尺寸,提高I/o操作的类查找速度。
5:odex是为了在运行过程中进一步提高性能,对dex文件的进一步优化。
6:所有的Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制
7:有一个特殊的虚拟机进程Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和Zygote共享一块内存区域。
2. Android中的动画有哪几类,它们的特点和区别是什么?
android支持两种动画模式,tween animation,frame animation
View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。
View animation只能应用于View对象,而且只支持一部分属性,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化.
另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
3. Handler机制的原理
andriod提供了Handler 和Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从MessageQueue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
4. 说说mvc模式的原理,它在android中的运用
mvc是model,view,controller的缩写,mvc包含三个部分:
模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如果你对android了解的比较的多了话,就一定可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重任 通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理,这 样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
5. 横竖屏切换时activity的生命周期
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
6. 请介绍下android大众常使用的五种布局
常用五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)。
一、 FrameLayout:所有东西依次都放在左上角,会重叠,这个布局比较简单,也只能放一点比较简单的东西。二、LinearLayout:线性布局, 每一个LinearLayout里面又可分为垂直布局(android:orientation="vertical")和水平布局 (android:orientation="horizontal" )。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每一个元素依次向右排列。三、AbsoluteLayout:绝对布局用X,Y坐标来指定元素的位置,这种布局方式也比较简单,但是在屏幕旋转时,往往会出问题,而且多个元素的时候,计算比较麻烦。四、RelativeLayout:相对布局可以理解为某一个元素为参照物,来定位的布局方式。主要属性有:相对于某一个元素android:layout_below、 android:layout_toLeftOf相对于父元素的地方 android:layout_alignParentLeft、android:layout_alignParentRigh;五、 TableLayout:表格布局,每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素。每一个布 局都有自己适合的方式,这五个布局元素可以相互嵌套应用,做出美观的界面。
五、英文翻译
把一下段落翻译成中文
a) An integral(完整的;整体的;完全的)approach to code documentation is to write the code so that it documentsitself. In other words, the code should be naturally readable in such a way asto make it easy to understand. This is accomplished by proper namingconventions and statement(声明) formatting.
b)Collections(集合) are thedata structures that are most easily altered for performance-tuning purposes.Using the correct or most appropriate collection class can improve performancewith little change to code. For example, if a large ordered collection haselements frequently deleted or inserted throughout it, it usually can providebetter performance if based on a linked list rather than an array. On the otherhand, a static(unchanging) collection that needs to be accessed by indexperforms better with an underlying implementation that is an array.
真题3:刚刚答完人人网的笔试题,不让把草稿纸带出来,只能凭着记忆复盘了,第一部分还差一题,有人记得可以补充一下,题目基本上都是简单说明,但是意思基本表达到了,第四部分感觉有点困难,天南大还是有很多高手啊,我是结结实实做了2个多小时,提前交的挺多的,呵呵,有些基础题做的不太好,比如那个已知先序和中序求后序就没有弄出来,时间有点不够,再读读离散研究下。
原题如下:
第一部分(12*5)
1.一颗完全二叉树共有768个节点,求叶节点个数____个。
2.一颗由链表实现的有n个节点,那么指针数____个,指向节点的指针数____个,空闲的指针个数____个。
3.哈希散列题,给了11个数字,使用0到12进行散列,填一张表
4.1000的阶乘的尾部0的个数____个
5.liux下mkdir,如果父目录不存在,使用附属命令创建父目录
6.”vmstat1“的命令,给出了一张表格,及6个选项判断正误(记不得了)
7.(树)前序AEFBGCDHIKJ,中序:EFAGBCHKIJD,求后序
8.(数据库题)Table1:(5 2 2)(5 3 1)(5 2 3)Table2:(5 2 2)(5 3 1)(5 4 4)使用SQL语句找出存在于Table1中而不存在于table2中数据。
9.俩人玩游戏,在脑门上贴数字(正整数>=1),只看见对方的,看不见自己的,而且两人的数字相差1,要猜自己的数字
A:我不知道
B:我也不知道
A:我知道了
B:我也知道了
A头上的字:____;B头上的字:_____;
10:
11:以下四种排序那种效率最低____,时间复杂度是多少_____
A:快排 B:冒泡 C:归并 D:选择
12:小明的IP是:200.99.***.5,子网掩码是255.255.148.0,问该子网有多少个IP_____个
第二部分(3*10)
1.二叉搜索树中给定两个节点:BSTNode1和BSTNode2,查找他们的最近公共父节点
2.环状单链表,给定指向某个节点的指针,编写算法求离其最远的节点
3.三个以上设计模式,并用Java或C++实现
第三部分(4*15)
1.无交集数据放在10台计算机上,如何高效的选出Top10
2.24点游戏,给定四个整数,可以使用加减乘除四种运算法则,但是每个数只能用一次,编写游戏解法
3.三国杀,规则”杀“使对方体力减一半,”闪“可以免除杀一次,现有30张”杀“,15张”闪“,五个人玩游戏,每轮一人三张牌,问出现体力为0的概率
4.万台服务器(集群),构造一个监控系统去监视该服务器,监控服务器主动或者被动去监控服务器集群,要求每个一段间隔获取服务器集群的数据,请设计方案,并提供相关数据:监控服务器数量,带宽,时间间隔等。
人人网校园招聘杭州站C++笔试题目1.算法的几个概念:时间复杂度,空间复杂度等等。
2.采用链地址法处理长度的时候,哈希表查找成功的平均长度与哪些因素有关?
哈希表的装填因子有关。
装填因子= 表中填入的记录数/哈希表的长度。
3.二叉树节点的计算:
二叉树中度为1的节点有8个,度为0的节点有3个,问这颗二叉树总共有多少节点?
对于任意一棵二叉树BT,如果度为0的结点个数为n0,度为2的结点个数为n2,则n0=n2+1。
所以度为2的节点个数为3-1 = 2,那么总共的结点个数就是3+2+8 = 13。
顺便复习一下完全二叉树的计算。
完全二叉树有一个特点,就是度为1的节点数要么为1,要么为0。可以自己画出图来看看。
问题:如果设一棵完全二叉树共有500个结点,则在该二叉树中有多少个叶子结点?
设叶子节点数为n0,度为2的节点数为n0 - 1,又因为是完全二叉树,所以n1 = 1或者0
n0 + n1 + n2 = 500,带入 2n0 - 1 + n1 = 500,故n1 = 1,n0 = 250, n2 = 249。
5.最小生成树的问题,节点个数计算问题。
6.在序列有序的情况下,快速排序的时间复杂度是多少?
O(n^2)。
7.网卡完成那一层的功能?
网卡工作在物理层和数据链路层的MAC子层。
https://leehlom.blog.163.com/blog/static/241206962008112775913541/。
8.模板函数的使用。
template
T add(T x, T y){
return x + y;
}
A.add(5,2)
B.add(5.2,2.2)
C.add(5.2,2)
D.add(5.2,2)
D是错误的,因为编译器知道要特化哪一个了。
8.构造函数可以重载么?析构函数可以重载么?
构造不重载,怎么实现多样化?
析构怎么重载,没有参数。
10.C++静态成员和非静态成员有什么区别?
1)静态变量是属于类的,只能用classname::来调用.而非静态是属于对象的,必须通过对象
来调用.
2)如果在函数中声明一个静态变量的话,它存储在非函数的活动区.就是它不随函数调用的
结束而释放内存空间,所以它也具有全局变量的特点.但是和全局变量相比不同在于它只能在本
文件中使用
11.空类的大小?一个含有虚函数的类大小?为什么?
分别是1和4。
因为,对于空类,C++编译器会制定一个char来占据位置。
含有虚函数的类,里面会存放一个虚函数指针vptr,指向一个虚函数表。指针在32位平台上的大小为4个字节。
12 OSI七层模型和TCP/IP 五层模型。
应用层
表示层
会话层 应用层
传输层 传输层
网络层 互联网络层
数据链路层 互联接口层
物理层 物理层
12.编程求解走楼梯问题:
一个人一次可以上1步,2步,3步。现在有n个阶梯(1<= n <= 100W,问有方法可以上去?
)
f(1) = 1;
f(2) = 2;
f(3) = 4;
n > 3,f(n) = f(n - 1) + f(n - 2) + f(n -3)
13.人人网的朋友概念:A和B是朋友,B和C是朋友,那么A和C是二度朋友。
找出每一个人的10度朋友。要求O(n)的算法
14.推荐系统的设计