第二套Java笔试题(JD)

117 阅读7分钟

第二套笔试题,做完感觉自己基础真差,算法题这次一道都没打出来,也不知道大学三年在学什么。。。只能说再好好加油吧。

一. 客观题

1.已知小顶堆:{51,32,73,23,42,62,99,14,24,3943,58,65,80,120},请问62对应节点的左子节点是?

  51

        32                 73

    23 42                 62     99

14 24 39 43     58 65 80 120

                    14

             51            58

    32 39                 73     80

23 24 42 43     62 65 99 120

                  14

             23             58

     24 39             62     80

32 51 42 43     73 65 99 120 (这道题明天补充一个图上去)

2. 若串S=”UP!UP!JD”,则其子串的数目

子串的公式 :(n * (n+1)) / 2 + 1,其中,n 为所求字符串的字符个数,不包括空格
子串的定义是:任意个连续的字符组成的子序列(包括空串),不能有重复

3. 网络中心linux服务器开启ssh服务与ftp服务,允许开发部工程师zhang1下载文件,拒绝其登录ssh服务,下列配置正确的是

vi /etc/passwd zhang1:x:500:500::/home/zhang1:/sbin/nologin

4. DELETE和TRUNCATE TABLE都是删除表中的数据的语句,它们的不同之处描述正确的是:

以下都正确:

  • 如果想保留标识计数值,要用DELETE,因为TRUNCATE TABLE会对新行标志符列使用的计数值重置为该列的种子
  • TRUNCATE TABLE比DELETE的速度快
  • 对于被外键约束的表,不能使用TRUNCATE TABLE,而应该使用不带WHERE语句的DELETE语句
  • 在删除时如果遇到任何一行违反约束(主要是外键约束),TRUNCATE TABLE仍然删除,只是表的结构及其列、约束、索引等保持不变,但DELETE是直接返回错误

5. 代码输出什么?

public class Test {  
  
   public static void main(String[] args) {  
       System.out.print(B.c);  
   }  
}  
  
class A {  
   static {  
       System.out.print("A");  
   }  
}  
  
class B extends A{  
   static {  
       System.out.print("B");  
   }  
   public final static String c = "C";  
}

解析:只输出C,因为虽然 class B 继承了 class A,但是在输出的时候并没有创建 class Bclass A 的实例,而是直接访问了静态变量 c。在 Java 中,当访问一个类的静态成员(静态变量或静态方法)时,不会触发类的初始化,只有在实际需要类的初始化时才会触发。

6. 网络管理员把优盘上的源代码给程序员参考,但要防止程序误删除或修改,以下正确的加载方式是

mount -r /dev/sdb1 /tools mount -o ro /dev/sdb1 /tools

7.echo expr 3/4的expr是什么

在Linux或Unix系统中,expr 是一个用于执行数学表达式计算的命令。它可以用于执行各种基本的数学运算,例如加法、减法、乘法、除法和取余等

8. Shell 脚本(shell script),是一种为 shell 编写的脚本程序。现有一个test.sh文件,且有可执行权限,文件中内容为:#!/bin/bash aa='Hello World !' 请问下面选项中哪个能正常显示Hello World!

source test.sh >/dev/null 1 && echo $aa

  1. source test.sh:这部分执行了脚本文件 test.sh,使用 source 命令可以让脚本中的变量和命令对当前 shell 产生影响,而不是在子 shell 中执行。
  2. >/dev/null:这部分将标准输出(stdout)重定向到 /dev/null,这是一个特殊的设备文件,将数据写入其中会被丢弃,因此这里的目的是不在终端显示脚本的输出。
  3. 1 &&:这部分是一个逻辑与运算符(&&),它表示只有前面的命令执行成功(返回状态码为0)时,才会执行后面的命令。
  4. echo $aa:如果前面的命令执行成功,即脚本 test.sh 成功执行且没有输出,那么这部分会输出环境变量 aa 的值

9. Ext3日志文件系统的特点是?

  • 数据转换快
  • 多日志模式
  • 高可用性
  • 数据的完整性

10. 根据类加载器加载类的初始化原理,推断以下代码的输入结果为?

public class Test {  
  
   public static void main(String[] args) throws Exception{  
     ClassLoader classLoader=ClassLoader.getSystemClassLoader();  
     Class clazz=classLoader.loadClass("A");  
     System.out.print("Test");  
     clazz.forName("A");  
   }  
}  
  
class A{  
   static {  
       System.out.print("A");  
   }  
}

解析: 用ClassLoader加载类,是不会导致类的初始化(也就是说不会执行方法).Class.forName(...)加载类,不但会将类加载,还会执行会执行类的初始化方法.所以答案是TestA

11.将标准输出和错误重定向到a.txt文件

a.txt 2>&1

2>&1 表示将标准错误(文件描述符2)重定向到与标准输出相同的位置(文件描述符1),这样错误信息也会写入到 a.txt 文件中

12. 下面有关值类型和引用类型描述正确的是()?

  • 引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类
  • 值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址
  • 值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例

13. 公司网络中心有的服务器不配备光驱,有的服务器USB端口损坏,网络管理员根据不同的环境可以使用不同的linux 操作系统安装方式,一般支持以下方式:

  • Hard drive
  • NFS
  • CDROM

14. 以下程序输出的结果,正确的是?

public class Main {  
  
   public static void main(String[] args) {  
       System.out.println("A");  
       new Main();  
       new Main();  
   }  
  
   public Main() {  
       System.out.println("B");  
   }  
  
   {  
       System.out.println("C");  
   }  
  
   static {  
       System.out.println("D");  
   }  
}  

答案:DACBCB

15. 线程池executor在空闲状态下的线程个数是?

import java.util.concurrent.*;  
public class Main {  
   public static void main(String[] args) {  
        ThreadPoolExecutor executor = new  
        ThreadPoolExecutor(5, 10, 15, TimeUnit.SECONDS,  
        new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy());  
      }  
}

5, 10, 15前三个参数:核心线程有5个,最大线程数是10个,keepAliveTime是15s,如果线程池中的线程大于5,那么超15s的空闲线程就会被结束,也就是说,一定会保持5个线程不会被结束。当所有任务完成后,会保持5个空闲的线程

编程题

1. 对比

题目描述

现有n个物品,每个物品有三个参数 ai , bi , ci ,定义i物品不合格品的依据是 : 若存在物品 j , 且aj>ai , bj>bi , cj>ci,则称i物品为不合格品。现给出n个物品的a,b,c参数,请你求出不合格品的数量。

输入: 第一行包含一个整数n(1<=n<=500000),表示物品的数量。接下来有n行,每行有三个整数,ai,bi,ci表示第i个物品的三个参数,1≤ai,bi,ci≤109。

输出: 输出包含一个整数,表示不合格品的数量。

答案:

import java.util.Scanner;

public class Main {
    static class Item {
        int a, b, c;

        Item(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Item[] items = new Item[n];

        for (int i = 0; i < n; i++) {
            int a = scanner.nextInt();
            int b = scanner.nextInt();
            int c = scanner.nextInt();
            items[i] = new Item(a, b, c);
        }

        int count = 0;

        for (int i = 0; i < n; i++) {
            boolean isDefective = false;
            
            for (int j = 0; j < n; j++) {
                if (items[j].a > items[i].a && items[j].b > items[i].b && items[j].c > items[i].c) {
                    isDefective = true;
                    break;
                }
            }
            
            if (isDefective) {
                count++;
            }
        }

        System.out.println(count);
    }
}

2. 完全多部图

题目描述 给定一张包含N个点、M条边的无向图,每条边连接两个不同的点,且任意两点间最多只有一条边。对于这样的简单无向图,如果能将所有点划分成若干个集合,使得任意两个同一集合内的点之间没有边相连,任意两个不同集合内的点之间有边相连,则称该图为完全多部图。现在你需要判断给定的图是否为完全多部图。

输入: 第一行输入一个整数T表示数据组数,1≤T≤10。

每组数据格式为: 第一行包含两个整数N和M,1≤N≤1000,0≤M≤N(N-1)/2;

接下来M行,每行包含两个整数X和Y,表示第X个点和第Y个点之间有一条边,1≤X,Y≤N。

输出: 每组输出占一行,如果给定的图为完全多部图,输出Yes,否则输出No。

答案:

import java.util.*;

public class Main {
    static final int N = 505;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();

        while (t-- > 0) {
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            int[][] e = new int[N][N];
            int[] f = new int[N];

            for (int i = 1; i < n; ++i) {
                for (int j = i + 1; j <= n; ++j) {
                    e[i][j] = 0;
                }
            }

            for (int i = 1; i <= m; ++i) {
                int u = scanner.nextInt();
                int v = scanner.nextInt();
                if (u > v) {
                    int temp = u;
                    u = v;
                    v = temp;
                }
                e[u][v] = 1;
            }

            for (int i = 1; i <= n; ++i) {
                f[i] = i;
            }

            for (int i = 1; i < n; ++i) {
                for (int j = i + 1; j <= n; ++j) {
                    if (e[i][j] == 0) {
                        f[find(f, i)] = find(f, j);
                    }
                }
            }

            if (judge(n, e, f)) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }

    static int find(int[] f, int x) {
        if (f[x] == x) {
            return x;
        }
        return f[x] = find(f, f[x]);
    }

    static boolean judge(int n, int[][] e, int[] f) {
        for (int i = 1; i < n; ++i) {
            for (int j = i + 1; j <= n; ++j) {
                if (find(f, i) == find(f, j) && e[i][j] == 1) {
                    return false;
                }
                if (find(f, i) != find(f, j) && e[i][j] == 0) {
                    return false;
                }
            }
        }
        return true;
    }
}