欢聚时代2018校招笔试题-Java开发/运维研发/数据挖掘

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiao__jia__jia/article/details/82291073

                   欢聚时代2018校招笔试题-Java开发

1.以下哪些是操作系统的名称?
A.Windows
B.Linux
C.Solaris
D.UNIX
答案:abcd
解析:solaris 是unix系统的衍生

2.关于进程和线程,以下哪些说明是错误的
A.无论多进程和多线程架构的程序,都可以做到利用CPU多核多线程的能力
B.Linux内核看来,进程只是一个资源分配单位,线程才是一个实际的执行体
C.某个进程fork出来的多个子进

程,它们的内存是共享的
D.多线程架构的调度开销要小于多进程架构,因此多线程性能会更好一些

答案:bcd
解析:
3.CPU的状态转换中,以下哪些是可能发生的
A.Running -> Waiting
B.Running -> Blocked
C.Blocked -> Waiting
D.Blocked -> Running

答案:abc
解析:



 

Java中内存模型中,Metaspace(即元空间,也叫方法区)是从哪个版本开始引入的?
A.Java 6
B.Java 7
C.Java 8
D.Java 9
答案:C
解析:

Java 8彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至Java Heap或Metaspace。

    在HotSpot JVM中,永久代中用于存放类和方法的元数据以及常量池,在Java中对应能通过反射获取到的数据,比如Class和Method。每当一个类初次被加载的时候,它的元数据都会放到永久代中。

永久代是有大小限制的,因此如果加载的类太多,很有可能导致永久代内存溢出,即 java.lang.OutOfMemoryError: PermGen 。为此我们不得不对虚拟机做调优

Java 8中永久代被移出HotSpot JVM的原因主要有两个:

1、由于Permanent Generation内存经常不够用或发生内存泄露,引发java.lang.OutOfMemoryError: PermGen (在Java Web开发中非常常见)。

2、移除Permanent Generation可以促进HotSpot JVM与JRockit VM的融合,因为JRockit没有永久代。

根据上面的各种原因,永久代最终被移除,方法区移至Metaspace,字符串常量移至Java Heap。

 

以下哪些关键字/类可以达到不同线程互斥访问的效果?

A.ReentrantLock
B.volatile
C.static
D.synchronized

答案:AD
解析:B锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。Volatile 变量具有 synchronized 的可见性特性。这就是说线程能够自动发现 volatile 变量的最新值。

以下描述中,哪些是完全正确的?
A.对象实例中的成员变量是线程安全的
B.方法内定义的变量是线程安全的
C.Singleton(单例)实例中的成员变量是线程安全的
D.volatile的变量是线程不安全的

答案:BD

关于Java的语法,以下描述中哪些是正确的?

A.一个类可以继承(extends)一个或多个父类
B.一个类可以实现(implements)一个或多个接口
C.一个接口可以继承(extends)一个或多个其它接口
D.一个接口以实现(implements)一个或多个其它接口
答案:bc

List a = new ArrayList<______>();
下列哪些选项放在上面的<______>中是符合java语法的?
A.?
B.? extends Collection
C.LinkedList
D.DelayQueue
答案:cd
解析:非限制泛型不允许初始化

假设某个类有两个成员变量a和b,类型为Integer,以下为某个类中的2个方法,哪些组合是线程安全的?
A. public int sum(){synchronized(this){return a+b;}}<br>public void set(int a, int b){synchronized(this){this.a=a;this.b=b;}}
B. public synchronized int sum(){return a+b;}<br>public synchronized void set(int a, int b){this.a=a;this.b=b;}
C. public int sum(){synchronized(this.a){return a+b;}}<br>public void set(int a, int b){synchronized(this.a){this.a=a;this.b=b;}}
D. public int sum(){synchronized(this.a){return a+b;}}<br>public void set(int a, int b){synchronized(this.b){this.a=a;this.b=b;}}

答案:ab


Which statement(s) is (are) true about threads?

A. Threads created from the same class all finish together.
B. A thread can be created only by subclassing java.lang.Thread.
C. Invoking the suspend() method stops a thread so that it cannot be restarted.
D. JVM will exit when only daemon threads remains alive.

答案:D

关于构造函数的描述下列说法正确的是
A.构造函数不能被重载
B.构造函数不能被覆盖
C.一个构造函数可以返回一个私有的或一个对象的引用
D.构造函数代码执行顺序时是从最远的祖先类到当前的类层级
答案:BD

以下哪些项可以让两个同名的方法实现合法的重载?

A.形式参数个数不同
B.返回值类型不同
C.形式参数类型不同
D.形式参数名称不同
答案:AC

浮点数的表示范围和精度取决于?
A.阶码的基数
B.阶码的位数
C.尾数的位数
D.阶码和尾数的比例
答案:bc
解析:浮点数所能表示的范围取决于阶码;精度取决于尾数。
 

以下哪些是补码的优点?
A.减法也可以按加法来处理
B.简化对应计算部分的硬件结构
C.可以区分+0和-0
D.编码空间比原码大
答案:abd
解析:补码的优点:

  • 可将减法变为加法,省去减法器;
  • 无符号数及带符号数的加法运算可以用同一电路完成;
  • 使用补码,修复了原码中0的符号(有 [+0] [-0] 之分)以及存在两个编码(0000 0000 和 1000 0000)的问题,而且还能够多表示一个最低数。

以下哪些属于Linux使用的进程间通信方式?
A.管道
B.共享内存
C.信号量
D.套接字

答案:abcd

有能力处理网络层协议的网络设备是?

A.路由器
B.集线器
C.硬件防火墙
D.中继器
答案:ac
解析:

第一层(物理层):中继器、集线器

第二层(数据链路层):交换机、网桥

第三层(网络层):路由器

以下哪些方法不属于HTTP协议的标准方法?

A.PUT
B.POST
C.QUERY
D.REMOVE
答案:cd

请选择出属于TCP协议或IP协议中的概念
A.TTL
B.MTU
C.MAC
D.ESTABLISTED
答案:abd

 

以下哪些属于关系型数据库或对应SQL中的概念?

CPA
INDEX
MapReduce
HAVING
答案:bd

 

请选择出属于Oracle HotSpot JDK自带的命令行工具

jstack
jvisualvm
jhat
jstat

答案:abcd

名称 主要功能
jps JVM Process Status Tool,显示指定系统内所有HotSpot虚拟机进程
jstat JVM Statistics Minitoring Tool,用于收集HotSpot虚拟机各方面的运行数据
jinfo Configuration Info for Java,显示虚拟机配置信息
jmap Memory Map for Java,生成虚拟机的内存转储快照(heapdump)文件
jhat JVM Heap Dump Browser,用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果
jstack Stack Trace for Java,显示虚拟机的线程快照

//请写出程序的输出内容:

 

public class Test {
 public static Integer divide(int i) throws Exception {
 Integer result = null;
 try{
 result = 9/i;
 System.out.print("A");
 } catch(Exception ex) {
 System.out.print("B");
 throw new Exception("C");
 } finally {
 System.out.print("D");
 }
 return result;
 }
 public static void main(String [] args) {
 try{
 System.out.print(divide(0));
 System.out.print("E");
 } catch(Exception ex) {
 System.out.print("F");
 }
 System.out.print("G");
 }
}

参考答案 
(1) BDFG



 

如图所示,在内网的机器192.168.1.1需要通过NAT方式访问外部的一个服务(地址为135.2.1.1,端口为80)。NAT处的外网地址为202.0.1.1,本次访问的NAT映射信息见图中的"NAT地址转换表"。请按图中1的形式写出图中2,3,4中的的对应信息,注意同时按1中形式注明端口号。 1 2 3 【注意:S和D间用空格分割】
 

参考答案 
(1) S=202.0.1.1,5001 D=135.2.1.1,80
(2) S=135.2.1.1,80 D=202.0.1.1,5001
(3) S=135.2.1.1,80 D=192.168.1.1,3342


 

如上的数据库表设计,请填写以下的空白:


CREATE TABLE depositor (
customer_name char(20), 
account_number char(10),
PRIMARY KEY 1 )

SELECT D.customer_name, SUM(A.balance) FROM depositor AS D, account AS A
WHERE 2 GROUP BY 3 

参考答案 
(1) customer_name, account_number 或 account_number, customer_name
(2) D.account_number = A.account_number 或 A.account_number = D.account_number
(3) D.customer_name 或 customer_name

有一棵树的构造如图所示,请写出它的先根序遍历结果 1 和后根序遍历结果 2 。



 

你的答案 (正确)

1 FBADCEGIH

2 ACEDBHIGF

在工作中经常需要计算一些字符串出现的次数,请写一个字符串计数的工具类,它需要实现下面的接口。注意这个类需要支持高并发的情况下使用。

pulic interface Counter {

    // 获取一个字符串的出现次数

    int get(String str);

    // 增加一个字符串的出现次数

    void add(String str);

}


解析:

) 本题主要考察学生的基本编程能力。和对并发程序的了解。

2) 关注点一:基本语法:即是否可以写出基本符合语法的程序。如:基本的命名规范,定义中使用正确的关键词,类方法需要为public的等

3) 关注点二:基本功能:即是否可以实现题目的要求,如查询时如果字符串不存在,需要返回0 (因为接口要求返回是int),增加时需要处理还没有添加过的情况等。

4) 关注点三:并发使用:即在高并发情况下,需要使用合理的数据结构,如ConcurrentHashMap,AtomicInteger等。

5) 满分或接近满分的情况,要求给出的方案正确且支持高并发下的使用。

6) 如果无法支持高并发使用,则即使程序正确,也建议最多给2/3的分数。

7) 其它情况请酌情给分。



import java.util.Scanner;
import java.util.concurrent.ConcurrentHashMap;

import org.omg.CosNaming.NamingContextExtPackage.AddressHelper;

public class Main implements Counter {
	static ConcurrentHashMap<String, Integer> concurrentHashMap ;
    public static void main(String [] args){
      Scanner in = new Scanner(System.in);
    concurrentHashMap = new  ConcurrentHashMap<>();
    String tempString =""; 
    while(in.hasNext()) {
    	   tempString = in.next();
    	  Main main = new Main();
    	  main.add(tempString);
    	  System.out.println(main.get(tempString));
      }
      
    }

	@Override
	public int get(String str) {
		
		return concurrentHashMap.get(str);
	}

	@Override
	public void add(String str) {
		if(concurrentHashMap.containsKey(str)) {
			concurrentHashMap.put(str, concurrentHashMap.get(str) + 1);
		}else {
			concurrentHashMap.put(str, 1);
		}
		
	}
}

interface Counter {
    // 获取一个字符串的出现次数
    int get(String str);
    // 增加一个字符串的出现次数
    void add(String str);
}




给定一个整型数组a (int[]),包含N个元素。判断是否这N个整数可以构造出一个 "按位与等式",即是否存在这样一个等式:将数组中的任意N-1个整数进行按位求与操作(即Java中的"&"操作),得到的结果等于剩下的那个整数,注意这N个整数在等式中均必须出现且只出现一次。举例一:给定一个数组[5,20,4],结果为:true,因为 "20 & 5 = 4"。举例二:[5,3,7,19],结果为:false,因为数组中任何三个整数按位取与,均无法等于剩下的那个整数。请按如下函数定义,写出你的程序。(注:不能使用本地IDE)

boolean isAndEqationExist(int[] a);

注:
1) 保证正确性的同时,请考虑复杂度,复杂度越低,得分越高。
2) 可以定义其它的一些辅助函数以改进程序的可读性。
 

参考答案

1) 本题主要考察学生的分析能力和编程能力。

2) 问题分析中,一个重要的点是,等号右边的数字的特征:因为是求与的结果,所以必然是最小的数字。如果能分析到这个点,则只需要一次求与的尝试,即可得出结论。

3) 满分或接近满分的情况,要求给出的方案时间和空间复杂度均为O(1)且程序基本正确。

4) 因为题目强调了复杂度,如果方案是暴力的方式,即使程序基本正确,则建议最多给2/3的分数。

5) 其它情况请酌情给分。


给定任意一个非空字符串,请编程回答存在多少种如下组合式的情况:"S1 + C1 + S2 + C2 + S3"。其中S1/S2/S3为任意非空字符串(三者可以相同也可以不同),C1/C2为任意字符,且C1=C2。举例一:字符串"duowan"存在0种。举例二:字符串"duowanisgood"存在2种:"du + o + wanisg + o + od"和"du + o + wanisgo + o + d"。请按如下函数定义编程:

public int compositionCount(String str);

注:
1) 保证正确性的同时,请考虑复杂度,时间复杂度越低,得分越高。

2) 可以定义其它的一些辅助函数以改进程序的可读性。

 

public static int compositionCount(String str) {
    Map<Character, Integer> counts = new HashMap<Character, Integer>();
    Map<Character, Integer> reduce = new HashMap<Character, Integer>();
                                                                        
    // 步骤一:截头去尾,因开头和结尾字符不可能是合法的情况
    String strToCheck = str.substring(1, str.length() -1);
                                                                        
    // 步骤二:遍历字符串,计算字符的重复次数,并记录连续相同字符的次数
    Character last = null;
    for(Character c : strToCheck.toCharArray()) {
        counts.put(c, counts.getOrDefault(c, 0) + 1);
        if(last == c) {
            reduce.put(c, reduce.getOrDefault(c, 0) + 1);
        }
        last = c;
    }
                                                                        
    // 步骤三:计算结果
    int result = 0;
    for(Character c : counts.keySet()) {
        if(counts.get(c) < 2) {
            continue; // 字符无重复,无需计算
        }
        // 结果是一个"数学组合"的计算
        result += combination(counts.get(c), 2);
        // 需要减去连续出现符的情况
        result -= reduce.getOrDefault(c, 0);
    }
    return result;
}
                                                                        
public static int combination(int n, int r) {
    // 计算"数学组合":C(r,n) = n! / (r! * (n-r)!)
    return factorial(n) / (factorial(r) * factorial(n - r));
}
                                                                        
public static int factorial(int n) {
    // 计算阶乘
    if (n < 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

参考解析:

1) 本题主要考察学生的分析能力和编程能力。

2) 问题分析中,一个重要的点是,因为C1与C2必须相同,故可以遍历整个字符串,算出每个字符的出现次数,然后根据出现次数直接算出最终的结果。同时有一些需要注意的细节:A) 由于S1/S2/S3均需要非空,故两个连续相同的字符无法组成一个合法的情况,需要额外处理(额外减1)。B) 开头和结尾的字符由于前/后没有字符了,故也不应该纳入计算。

3) 满分或接近满分的情况,要求给出的方案复杂度为O(1)且程序基本正确。同时考虑到了细节。

4) 因为题目中强调了时间复杂度,如果方案是暴力的方式,即使程序基本正确,则建议最多给2/3的分数。

6) 其它情况请酌情给分。
 

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/82291073