蘑菇街2015校招 Java研发笔试题 详解

1. 对进程和线程描述正确的是( )

  A.  父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间。

  B.  改变进程里面主线程的状态会影响其他线程的行为,改变父进程的状态不会影响其他子进程。

  C. 多线程会引起死锁,多进程则不会。

  D.  以上都不对。  

  解析:A错,进程拥有独立的地址空间;B错,主线程和子线程是并行关系的时候,并没有依赖关系。父进程和子进程中,子进程是父进程的一个副本,创建子进程后,子进程会有自己的空间,然后把父进程的数据拷贝到子进程的空间里。运行时,谁先运行是不确定的,这由系统决定;C错,多线程和多进程都会引起死锁,一般说的死锁指的是进程间的死锁。

  进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。

2.  数据库里面建索引的常用数据结构是()

  A.单向链表  B.栈  C.B+树  D.队列

  解析:索引是对记录按照多个字段进行排序的一种方式。对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录。这种索引的数据结构是经过排序的,因而可以对其执行二分查找。索引的缺点是占用额外的磁盘空间。因为索引保存在数据库中,所以如果为同一个表中的很多字段都建立索引,那这个文件可能会很快膨胀到文件系统规定的上限。

   在数据库系统的使用过程当中,数据的查询是使用最频繁的一种数据操作。最基本的查询算法当然是顺序查找(linear search),遍历表然后逐行匹配行值是否等于待查找的关键字,其时间复杂度为O(n)。但时间复杂度为O(n)的算法规模小的表,负载轻的数据库,也能有好的性能。  但是数据增大的时候,时间复杂度为O(n)的算法显然是糟糕的,性能就很快下降了。好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。索引是对数据库表中一个或多个列的值进行排序的结构。与在表中搜索所有的行相比,索引用指针指向存储在表中指定列的数据值,然后根据指定的次序排列这些指针,有助于更快地获取信息。通常情 况下,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引将占用磁盘空间,并且影响数据更新的速度。但是在多数情况下,索引所带来的数据检索速度优势大大超过它的不足之处。目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构。

3. 蘑菇街公司里面随便找四名员工。那么这四名员工里面,至少有两个人的生肖是相同的概率是()

  A.41/96  B.55/96  C.72/128  D.90/128

  解析:P(A)=1-12*11*10*9/12^4=41/96。

4.  蘑菇街是一家拥有500名员工的年轻富有活力的公司,小侠们(男性员工)诚实可靠,只说真话。而小仙们(女性员工)调皮可爱,只说假话。某一天一位客户来公司参观,就问公司的员工,你们公司有几个小仙呀?公司的员工们很热心的一一做了回答,第一个员工说一个,第二个员工说二个...第五百个员工说五百个。请问蘑菇街到底有几个小仙?

  A.1  B.250  C.499  D.500

  解析:首先,只可能有一个员工说的对,其他都说的是错的,不可能两个人都说的对。那么男的只有一个,剩下的499都是女的。

5.  IP地址131.53.12.71是一个()类IP地址?

  A.A  B.B  C.C  D.D

  解析:A类网络的IP地址范围为1.0.0.1-127.255.255.254;B类网络的IP地址范围为:128.1.0.1-191.255.255.254;C类网络的IP地址范围为:192.0.1.1-223.255.255.254。由于A类地址的特点是网络标识的第一位二进制数取值必须为“0”。所以网段号到127,后面是具体的主机号的分配。

6.  如果某系统12*5=104成立,则系统采用的是()进制?

  A.6  B.7  C.8  D.9

7. 编程实现一个函数,输入为一个给定的由英文单词组成的字符串,按照英文单词的顺序反转输出。例如,给定的字符串是"hi welcome to mogujie", 那么输出为"mogujie to welcome hi"?

public class InterruptString {
    public static void main (String args[]){
        String str = "hi welcome to mogujie";
        for(int i = inverse(str).length - 1; i >= 0 ; i--){
            System.out.print( inverse(str)[i]+" ");
        }
    }

public static String[] inverse(String str){    
    String strArray[] = str.split(" ");
    return strArray;
}
}

8. 输入一个整型数组,数组里面有正数也有负数,数组中连续的一个或多个整数组成子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如,输入的数字为:1,-2,3,10,-4,7,2,-5,则和最大的子数组为3,10,-4,7,2.和为18.

public class SonArray {
    public static void main(String args[]){
        Integer[] arrayIntegers = {1,-2,3,10,-4,7,2,-5};
        String[] str = sonArray(arrayIntegers).split(" ");
        System.out.println("The Big Sum is:" + str[0]);        
    }
    static String sonArray(Integer[] array){
        int sum = 0, max = 0;
        for(int i = 0; i < array.length; i++){
            sum += array[i];
            if(sum < 0){
                sum = 0;
            }
            max = sum > max?sum:max;
        }
        return max+" ";
    }
}

9. 给定一串字符串(英文段落),用户输入某个单词,求该单词出现的总次数,和出现在第几个位置上。

//  Java语言是先编译后执行

import java.util.ArrayList;


public class DivString {
public static void main(String args[]){
String str = "i love china i china china love love love xu";
String strArray[] = str.split(str);
ArrayList<String> arrayList = new ArrayList<String>();
for(int i = 0; i < strArray.length; i++){
if(strArray[i])
arrayList.add(strArray[i]);
}
}

}

10. 简述mysql数据库的锁机制 

  数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

  悲观锁和乐观锁:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

11. 两个超出内存表示的十分大的数之和的算法,以及大数阶乘的解决方案?

  先来说说数,在计算机中,数是存贮在内存(RAM)中的。在内存中存储一个数有两类格式,定点数和浮点数。定点数可以精确地表示一个整数,但数的范围相对较小,如一个32比特的无符号整数可表示0-4294967295之间的数。浮点数能表示更大的范围,但精度较低。当表示的整数很大的,则可能存在误差。一个8字节的双精度浮点数可表示2.22*10^-308到 1.79*10^308之间的数,可精确到15-16位数字.

  大尾序和小尾序,我们在书写一个数时,总是先写权较大的数字,后写权较小的数字。但计算机中的数并不总是按这个顺序存放。小尾(Little Endian)就是低位字节排放在内存的低端,高位字节排放在内存的高端。例如对于一个4字节的整数0x12345678,将在内存中按照如下顺序排放, Intel处理器大多数使用小尾(Little Endian)字节序。

  大数超出了计算机的整形表示范围,故一般用字符串记录,两个大数相加就不能简单的用“+”进行运算,得绕个弯。先把字符串转成int数组(借助与字符'0'的差来实现),每位都放在数组中,然后对数组进行按位加

12. 什么是ICMP协议?

  ICMP(Internet Control Message Protocol)协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。

  ICMP是:Internet 控制信息协议(ICMP)是 IP 组的一个整合部分。通过 IP 包传送的 ICMP 信息主要用于涉及网络操作或错误操作的不可达信息。 ICMP 包发送是不可靠的,所以主机不能依靠接收 ICMP 包解决任何网络问题。ICMP不象TCP或UDP有端口,但它确实含有两个域:类型(type)和代码(code)。而且这些域的作用和端口也完全不同。Ping用到的是ICMP协议。不是端口。
13. 一台刚刚接入互联网的WEB服务器第一次被访问到时,不同协议的发生顺序是下面中的____。
A: ARP -> DNS -> HTTP   之所以有arp是要经过路由器,路由器是下三层的协议交互
B: ARP -> HTTP -> DNS
C: DNS -> HTTP -> ARP
D: DNS -> ARP -> HTTP

解题思路:DNS是用于把域名转为IP地址,ARP协议是IP地址向物理地址转,HTTP超文本传输协议应用于应用层。一台刚刚接入的互联网的web服务器首次访问。可以推测任何客户端都没有dns缓存,不直接通过ip访问的话,那么从客户端发起请求则dns~http~ip~arp~中间节点~arp~服务器~服务器ip~http。 有关的顺序dns~http~arp~http。

14. 合并两个有序数组,假设第一个数组空间足够容纳两个数组。 (要求高效率)

考虑到a数组很大,可以直接在a数组上进行合并,但是要讲究效率。如果单纯从前往后合并,那么效率会非常低,因为a数组后面的数字需要不停的移动。换一种思路,我们采用从后往前合并,首先计算出总长度,设置一个指针从a数组最后往前移动。

总结:字符串合并时,我们更应该考虑从后往前这种思路。

15. java不支持全局变量,java中的所有的变量必须在类中或者接口中,如果想要实现全局变量的功能,可以专门设置一个类里面包含一些静态变量。java"垃圾回收"   System.gc();是单线程的,建议最好不要使用,如果你的应用程序处理业务很多且是多线程的话,最好不要使用gc(),一般在编程中尽量不要使用全局变量,应该尽可能的提供一些方法出来,如:get,set。垃圾收集只在下面两种条件下运行:有回收对象,并且需要回收这些对象。java运行期系统只有在需要时才进行垃圾收集。所以你并不知道垃圾收集发生的准确时间。另外可以调用System.gc()和Runtime.getRuntime().gc()方法来进行垃圾收集。static变量实质上相当于全局变量。但是枚举就可以用全局变量了,因为枚举对程序没有什么影响。

 
原文地址:https://www.cnblogs.com/RunForLove/p/4671526.html