【面试】牛客网Java专项练习刷题记录

程序运行题

  • enum AccountType
    {
           
        SAVING, FIXED, CURRENT;
        private AccountType()
        {
           
            System.out.println(It is a account type”);
        }
    }
    class EnumOne
    {
           
        public static void main(String[]args)
        {
           
            System.out.println(AccountType.FIXED);
        }
    }
    
    • 判断的是枚举类的运行,此枚举类中有三个方法,所以最终会调用三次构造方法,最终输出三次 It is a account type。

选择题

  • 关于Java中的数组,下面的一些描述,哪些描述是准确的:( )
    • 正确答案: A C F 你的答案: A D F (错误)
A.数组是一个对象,不同类型的数组具有不同的类
B.数组长度是可以动态调整的
C.数组是一个连续的存储结构
D.一个固定长度的数组可类似这样定义: int array[100]
E.两个数组用equals方法比较时,会逐个便利其中的元素,对每个元素进行比较
F.可以二维数组,且可以有多维数组,都是在Java中合法的

数组是一个对象,创建的时候语法规则如下:

int[] arr1 = new int[5];
int[] arr2 = {
     1,2,3,4,5};
int[] arr3 = new int[]{
     1,2,3,4,5};

别的方法都是语法错误。比较应该使用Arrays.equals()方法,数组对象的equals方法没有重写,Object.equals()比较的是两个数组的地址值。

  • 以下关于进程、线程、协程的的说法正确的是?

    正确答案: B D 你的答案: A B (错误)

    A.进程是操作系统能够进行运算调度的最小单位
    B.线程是堆共享,栈私有
    C.线程是堆私有,栈共享
    D.一般而言,执行开销进程 > 线程 > 协程
    

A选项,正确应该是线程才是操作系统能够进行运算调度的最小单位。

  • 以下哪些请求方法是HTTP规范中支持的请求方法

    正确答案: A B D E 你的答案: A B (错误)

    GET
    HEAD
    INSERT
    DELETE
    TRACE
    

HTTP规范中的常用方法:GET(获取文档)、POST(发送数据)、HEAD(获取文档首部)、PUT(请求主体存储在服务器)、TRACE(报文追踪)、OPTIONS(决定执行的方法)、DELETE(删除文档)。运行的对象全部为服务器,而不是针对客户端。

  • 下列关于PC机性能的叙述中,哪些是正确的

    正确答案: A B C 你的答案: A B (错误)

    逻辑结构相同时,CPU主频越高,速度就越快
    总线的传输速率与总线的数据线宽带、总线工作频率等有关
    通常cache容量越大,访问cache的命中率就越高
    主存的存取周期越长,存取速度就越快
    

主要看C选项,cache容量越大,所能承载的cache数据就越多,就越有可能缓存到需要命中的cache数据,所以命中率和容量成正比。同时注意通常情况下,cache不会缓存无用数据。

  • 在一次挥手断开连接的过程中,以下TCP网络连接状态,哪些会出现在主动断开的一方

    正确答案: A B C 你的答案: B D (错误)

    FIN
    ACK
    TIME_WAIT
    CLOSE_WAIT
    
  • 编译程序工作时,通常有以下哪些阶段

    正确答案: A B C E 你的答案: B E (错误)

    词法分析
    语法分析
    中间代码生成
    语义分析
    目标代码生成
    

个人做题时候,心路历程是:语义分析应该是程序员干的事,而不是机器应该做的事。然后我查资料,发现编译程序的工作流程,通常有五个阶段,如下图所示:

【面试】牛客网Java专项练习刷题记录_第1张图片

题目可能还是有问题,先记下这张图吧。

判断题

  • 子类要调用继承自父类的方法,必须使用super关键字。
    • 错误。子类调用父类的构造方法和重写的父类的方法,要用super关键字;如果调用的是没有重写的方法,则可以直接调用。

问答题

  • off-heap是指那种内存?
    • off-heap是堆外内存,是JVM进程管理的内存。堆外内存意味着把内存对象分配在Java虚拟机的堆以外的内存,直接受操作系统管理。
  • &和&&、|和||分别有什么区别?~符号怎么运算?
    • &叫做按位与,无论符号两侧是否成立都会全部执行。&&叫做逻辑与,也叫短路与。前者符合后者将会跳过执行。
    • |叫做按位或,无论符号两侧是否成立都会全部执行。&&叫做逻辑或,也叫短路或。前者符合后者将会跳过执行。
    • ~符号的运算规则是取反之后再 -1

算法题

  • 对于给定的一个包含连续字母、连续数字及空格的字符串(不会出现字母和数字连在一起出现),实现字母部分按出现顺序排列而数字按照从小到达顺序排在最后一个字母的后面

输入

"xb 1 cc 5 dd 10 ee 2"

输出

"xb cc dd ee 1 2 5 10"

自己写的暴力方法,先是没有判断其中一方或者双方均为空的情况,二是没有考虑到数字长度问题。

public String char_and_num_return (String text_source) {
     
    // write code here
    int flag = 0;
    int isBlank = 0;
    char[] str = text_source.toCharArray();
    StringBuilder sb = new StringBuilder();
    StringBuilder num = new StringBuilder();
    for (int i = 0, strLength = str.length; i < strLength; i++) {
     
        char c = str[i];
        if (c >= '0' && c <= '9') {
     
            num.append(c);
            flag = 1;
        } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
     
            sb.append(c);
            isBlank = 0;
        } else if (c == ' ') {
     
            // 对于空格的处理需要判断,如果前面一位已经存在空格,应该不予处理
            if (isBlank == 0) {
     
                isBlank = 1;
                sb.append(c);
            }
            if (flag == 1) {
     
                num.append(c);
                flag = 0;
            }
        }
    }
    if (num.length() == 0 & sb.length() == 0) {
     
        return "";
    } else if (num.length() == 0) {
     
        return sb.toString().trim();
    } else if (sb.length() == 0) {
     
        return num.toString().trim();
    }
    String[] s = num.toString().split(" ");
    long[] strNum = new long[s.length];
    for (int i = 0; i < s.length; i++) {
     
        strNum[i] = Long.parseLong(s[i]);
    }
    for (int i = 0; i < strNum.length; i++) {
     
        for (int j = 0; j < strNum.length - 1 - i; j++) {
     
            if (strNum[j] > strNum[j + 1]) {
     
                long temp = strNum[j];
                strNum[j] = strNum[j + 1];
                strNum[j + 1] = temp;
            }
        }
    }
    if (isBlank == 1)
        sb.deleteCharAt(sb.length() - 1);
    for (long j : strNum) {
     
        sb.append(" ").append(j);
    }
    return sb.toString().trim();
}

你可能感兴趣的:(面试/面试题,java,面试)