2020年牛客网校招模拟笔试--题解(三月场)

牛客网校招模拟笔试--题解(三月场)

单选题

  1. 有土豆,萝卜各一筐,土豆有 240 个,萝卜有 313 个,把这两筐平均分给一些小朋友,一直土豆分到最后余 2 个,萝卜分到最后还余 7 个,求最多有多少个小朋友参加分水果?
  • 14
  • 17
  • 28
  • 34
    题解:求(240-2=238)和(313-7=306)的最大公约数即可。
  1. 下面有关java内存模型的描述,说法错误的是?
  • JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证
  • “synchronized” — 保证在块开始时都同步主内存的值到工作内存,而块结束时将变量同步回主内存
  • “volatile” — 保证修饰后在对变量读写前都会与主内存更新。
  • 如果在一个线程构造了一个不可变对象之后(对象仅包含final字段),就可以保证了这个对象被其他线程正确的查看。
  • 题解:volatile只保证可见性,不保证原子性,C正确。final只是指向不变,但是指向的值有可能变,所以依然不是线程安
  1. int A[3][2]={1,2,3,4,5,6};则A[2][1]和*(*(A+1)+1)的值分别是()
  • 6和4
  • 5和2
  • 4和6
  • 2和5
  • 题解:A[2][1]=6。 * A为指向头结点的指针,即A[0][0]=1;* (A+1)为行+1,即A[0][1]=2;* ( *(A+1)+1)为在A[0][1]的基础上列再+1,即A[1][1]=4。
  1. 如下关于进程的描述不正确的是()
  • 进程在退出时会自动关闭自己打开的所有文件
  • 进程在退出时会自动关闭自己打开的网络链接
  • 进程在退出时会自动销毁自己创建的所有线程
  • 进程在退出时会自动销毁自己打开的共享内存
  • 题解:共享内存销毁了,会对其他正在使用这段内存的进程造成破坏
  1. 某指令流水线由 5 段组成,各段所需要的时间分别是:t、3t、t、2t、t。问如果连续执行 10 条指令,则吞吐率是多少 ?
  • 0.1428/t
  • 0.2041/t
  • 0.2857/t
  • 0.3333/t
    题解:吞吐率公式:吞吐率 = 指令条数 / 流水线时间
    流水线时间公式:流水线时间 = 一条指令所需时间+(指令条数-1)* 时间最长的指令的一段
    在这里插入图片描述
  1. 下列哪一个不属于关系数据库的特点?
  • 数据冗余度小
  • 多用户访问
  • 数据独立性高
  • 数据共享性好
    题解:关系数据库的特点 > 1)数据集中控制 2)数据独立性高 3)数据共享性好 4)数据冗余度小。5)数据结构。6)统一的数据保护功能。
    7.下列哪一条是顺序存储结构的优点是()。
  • 插入运算方便
  • 删除运算方便
  • 可方便地用于各种逻辑结构的存储表示
  • 存储密度大
  1. 下面有关JSP内置对象的描述,说法错误的是?
  • session对象:session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止
  • request对象:客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应
  • application对象:多个application对象实现了用户间数据的共享,可存放全局变量
  • response对象:response对象包含了响应客户请求的有关信息
    题解:application对象是共享的,多个用户共享一个,以此实现数据共享和通信。
  1. 设A,B,C为三个事件,且A,B相互独立,则以下结论中不正确的
  • 若PC=1,则AC与BC也独立.
  • 若PC=1,则A并C与B也独立.
  • 若PC=0,则A并C与B也独立.
  • 若C属于B,则A与C也独立.
    题解:独立需要P(AC)=P(A)*P( C) 假设P:A,B,C均不为0,而A,B相交
    且P(AB)=P(A)P(B),C为B中不与A相交的部分(C=B-A∩B),那么明显P(AC)=0!=P(A)P( C)
  1. 下面不是面向对象的基本原则的是?
  • 单一职责原则(Single-Resposibility Principle)
  • 开放封闭原则(Open-Closed principle)
  • 抽象类原则(Abstract-Class principle)
  • 依赖倒置原则(Dependecy-Inversion Principle)
  • 接口隔离原则(Interface-Segregation Principle)
    题解:面向对象的五大基本原则
    单一职责原则(SRP)
    开放封闭原则(OCP)
    里氏替换原则(LSP)
    依赖倒置原则(DIP)
    接口隔离原则(ISP)
  1. 对于序列( 12 , 13 , 11 , 18 , 60 , 15 , 7 , 19 , 25 , 100 ),用筛选法建堆,必须从值为 ________ 的数据开始建初始堆。
  • 100
  • 12
  • 60
  • 15
    题解:有n个元素的序列,若使用筛选法建堆,则从位置为n/2取下整的元素开始建堆
  1. 若在一分页存储管理系统中,某作业的页表如下所示。已知页面大小为 1024 字节,则逻辑地址 3000 对应的物理地址为( )
    在这里插入图片描述
  • 7072
  • 1976
  • 3000
  • 3059
    题解:页面大小1024.逻辑地址3000。所以3000/1024=2 也就是页号,由表可知是2号页表,对应的实际的内存地址1号块。
    页表内的偏移量是3000%1024=952。因为块大小和页的大小相等,所以实际的物理地址是1*1024+952=1976
  1. 下面有关java classloader说法错误的是?
  • Java默认提供的三个ClassLoader是BootStrap ClassLoader,Extension ClassLoader,App ClassLoader
  • ClassLoader使用的是双亲委托模型来搜索类的
  • JVM在判定两个class是否相同时,只用判断类名相同即可,和类加载器无关
  • ClassLoader就是用来动态加载class文件到内存当中用的
    题解: JVM在判定两个class是否相同时,不仅要判断两个类名是否相同,而且要判断是否由同一个类加载器实例加载的。
    14.某盒中有 5 件产品,其中 2 件次品 . 现随机地从中 2 件,则 2 件中次品数的均值是( )
  • 1/5
  • 4/5
  • 3/5
  • 3/10
    题解:在这里插入图片描述
  1. 采用计数排序算法对数组A={1,0,3,1,0,1}进行排序,则辅助数组C的长度值为()
  • 4
  • 7
  • 5
  • 6
    题解:辅助数组的范围要涵盖待排序列中所有的值,长度取决于待排序列中最大值和最小值,数组A中最小值是0,最大值是3,所以辅助数组C应该是从0到3,长度为4。
  1. TELNET工作于( )
  • 网络层
  • 传输层
  • 会话层
  • 表示层
  • 应用层
    题解:在这里插入图片描述
  1. 一个递归算法必须包括()
  • 递归部分
  • 终止条件和递归部分
  • 迭代部分
  • 终止条件和迭代部分
  1. 若要求在 O( nlog2n ) 的时间内完成对数组的排序,且要求排序是稳定的,则可选择的 排序方法是( )
  • 快速排序
  • 堆排序
  • 归并排序
  • 直接插入排序
  1. 以下程序的运行结果是
public class Increment{
    
    
	public static void main(String args[]) {
    
    
	int a;
	a = 6;
	System.out.print(a);
	System.out.print(a++);
	System.out.print(a);
	}
 }
  • 666
  • 667
  • 677
  • 676
    题解:a++很好记的,表示先用后+,而++a表示先+后用。看+在前在后,也决定第一步。
  1. 若对n阶对称矩阵A(下标从1,1开始)以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B[1…(n(n+1))/2]中,则在B中确定aij (i<j)的位置k的关系为()
  • i*(i-1)/2+j
  • j*(j-1)/2+i
  • i*(i+1)/2+j
  • j*(j+1)/2+i
    题解:将对称矩阵中的n^2个元压缩存储在n(n+1)/2个元素的一维数组中,以行序为主序存储其下三角(包括对角线)中的元,假设一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元素a[i,j]之间存在着一一对应的关系:
    当i>=j时,k=i(i-1)/2+j-1;
    当i<j时, k=j(j-1)/2+i-1;

编程题

  1. 牛家庄幼儿园为庆祝61儿童节举办庆祝活动,庆祝活动中有一个节目是小朋友们围成一个圆圈跳舞。牛老师挑选出n个小朋友参与跳舞节目,已知每个小朋友的身高h_i。为了让舞蹈看起来和谐,牛老师需要让跳舞的圆圈队形中相邻小朋友的身高差的最大值最小,牛老师犯了难,希望你能帮帮他。
    如样例所示:
    当圆圈队伍按照100,98,103,105顺时针排列的时候最大身高差为5,其他排列不会得到更优的解

输入描述:

输入包括两行,第一行为一个正整数n(3 ≤ n ≤ 20)
第二行为n个整数h_i(80 ≤ h_i ≤ 140),表示每个小朋友的身高。

示例1

输入

4
100 103 98 105

输出

5

来自 追梦者_AIer

import java.util.Arrays;
import java.util.Scanner;

/*
 * 考虑我们已经将身高升序排序了,然后对于前k个小朋友组成队形的身高差的最大值的最小值为f(k),
 * 并且第k个和第(k-1)个小朋友是相邻的。现在我们加入第(k+1)个小朋友,
 * 考虑到第(k + 1)个小朋友身高是大于等于前面的小朋友,
 * 插入队形之后,第(k + 1)个小朋友一定与两个小朋友相邻, 
 * 所以当我们将第(k + 1)个小朋友插入到第k个和第(k - 1)个小朋友中间可以得到f(k + 1)
 * 的下界一定是max(f(k), h[k] - k[k - 2]),
 * 我们又注意到这样插入之后第(k + 1)个和第k个小朋友还是相邻的,于是这样可以一直推广下去。
 * 考虑最初3个小朋友的时候这样也是可行的, 于是问题变成了求max(h[i] - h[i - 2])。
 */

public class Main {
    
    

    public static void main(String[] args) {
    
    
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] num = new int[N];
        for(int i = 0 ; i < N ; i++){
    
    
            num[i] = in.nextInt();
        }
        Arrays.sort(num);
        int min = 0;
        for(int i = 2 ; i < N ; i++){
    
    
            min = Math.max(min,num[i]-num[i-2]);
        }
        System.out.print(min);
        in.close();
    }

}
  1. 有一条无限长的纸带,分割成一系列的格子,最开始所有格子初始是白色。现在在一个格子上放上一个萌萌的机器人(放上的这个格子也会被染红),机器人一旦走到某个格子上,就会把这个格子涂成红色。现在给出一个整数n,机器人现在会在纸带上走n步。每一步,机器人都会向左或者向右走一个格子,两种情况概率相等。机器人做出的所有随机选择都是独立的。现在需要计算出最后纸带上红色格子的期望值。

输入描述:
输入包括一个整数n(0 ≤ n ≤ 500),即机器人行走的步数。

输出描述:
输出一个实数,表示红色格子的期望个数,保留一位小数。

示例1

输入

4

输出

3.4
//思路:利用三维数组
//      dp[i%2][j][k]表示走了i步之后恰好有j个红色格子,并且此时机器人正好在第k个红色格子上的概率。时间复杂度O(n^3)
//      只使用i%2的原因是,现在只和前一个情况有关
import java.text.DecimalFormat;
import java.util.Scanner;
 
 
public class Main {
    
    
    public static void main(String[] args){
    
    
        int maxn = 500+5;  
        double[][][] dp = new double[2][maxn][maxn];
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();   // 走的步数
        double ans = 0;
        dp[0][1][0] = 1.0;  // 第0步,有一个红格子,在第0个红格子上,的概率为1
        for(int i=1;i<=n;i++){
    
    
            int cur = i%2;     // 0,1,0,1...
            int old = 1-(i%2);
            for(int j=1;j<=i;j++)    // 现在是第n次,则第n-1次最多是有n个格子
                for(int k=0;k<j;k++)
                    dp[cur][j][k]=0;   // 前前次的结果设为0
            //
            for(int j=1;j<=i;j++){
    
         // 第i步的红色格子数目至多为i个
                for(int k=0;k<j;k++){
    
      //
                    if(dp[old][j][k]>0){
    
    
                        // 往右走
                        int pos1 = j;   // 现在有的格子数
                        int pos2 = k+1; // 现在的位置是在k+1
                        if(pos1==pos2)  // 在有边界的条件,接下来右边会多一个空格的可能。k=j-1时。
                            ++pos1;     // 多一个空格
                        dp[cur][pos1][pos2]+=0.5*dp[old][j][k];
                        // 往左走
                        int pos3 = j;
                        int pos4 = k-1;
                        if(pos4==-1){
    
      // 边界条件,在位置-1的时候
                            pos3++;    // 格子数增加1
                            pos4++;    // 把-1的那个格子记为第0个格子~
                        }
                        dp[cur][pos3][pos4]+=0.5*dp[old][j][k];
                    }
                }
            }
        }
        // 知道概率以后求期望
        for(int i=1;i<=n+1;i++){
    
       // 走n步,至多有n+1个格子
            for(int j=0;j<i;j++){
    
      // 在第j个格子上
                ans+=i*dp[n%2][i][j];
            }
        }
        DecimalFormat f = new DecimalFormat("0.0");
        System.out.print(f.format(ans));
    }
}
  1. 牛牛在农场饲养了n只奶牛,依次编号为0到n-1, 牛牛的好朋友羊羊帮牛牛照看着农场.有一天羊羊看到农场中逃走了k只奶牛,但是他只会告诉牛牛逃走的k只奶牛的编号之和能被n整除。你现在需要帮牛牛计算有多少种不同的逃走的奶牛群。因为结果可能很大,输出结果对1,000,000,007取模。
    例如n = 7 k = 4:
    7只奶牛依次编号为0到6, 逃走了4只
    编号和为7的有:{0, 1, 2, 4}
    编号和为14的有:{0, 3, 5, 6}, {1, 2, 5, 6}, {1, 3, 4, 6},{2, 3, 4, 5}
    4只牛的编号和不会大于18,所以输出5.

输入描述:
输入包括一行,两个整数n和k(1 ≤ n ≤ 1000),(1 ≤ k ≤ 50),以空格分割。

输出描述:
输出一个整数表示题设所求的种数。

示例1

输入

7 4

输出

5
import java.util.Scanner;
public class Main {
    
    
    private static final int mod = 1000_000_007;
    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        System.out.println(escapeFarm(n, k));
    }
 
    /**
     * 从0~n-1的n个数中,取出k个
     * @param n n个数
     * @param k 取出k个
     * @return 组合数
     */
    public static int escapeFarm(int n, int k) {
    
    
        int[][] dp = new int[k+1][n]; //状态转移矩阵
        //初始赋值 ,i = 0时, 存在1个数,选出0个,余n为0,选出1个,余n为0,有1个
        dp[0][0] = dp[1][0] = 1;
        for (int i = 1; i < n; i++) {
    
       //i 从1到n-1,算到n-1即为0~n-1中,选出k个数,其和余n为0
//            for (int j = 1; j <= Math.min(i+1, k); j++) {    //最少选1个数,最多选k个数
            for (int j = Math.min(i+1, k); j > 0; j--) {
    
            //这个地方必须要倒序,因为j与j-1的值相关,即计算j时,j-1的值不能改变
                for (int l = 0; l < n; l++) {
    
    
                    dp[j][l] =(dp[j][l] + dp[j-1][(l-i+n)%n])%mod;
                }
            }
        }
        return dp[k][0];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36987489/article/details/104978895
今日推荐