【笔试】三七互娱笔试 JAVA服务端

博主前天做了三七互娱的web后端工程师方向的笔试,下面的链接为笔试后的总结:
https://blog.csdn.net/applying/article/details/80587129
然后第二天就被通知参加今晚的java服务端程序的笔试,目测第一个笔试是跪了,所以才被通知写第二个,em,还是太菜了
Java服务器程序的笔试,与web后端工程师方向的笔试都是一小时,题量都不多,java的只有21个题,14个单选,以及7个不定项选择,没有编程,内容涵盖java的各个方法,继承、多态、多线程、集合类、装箱,以及像数据结构,概率,操作系统的死锁判断等。总结其中的几个问题:
1.判断一个数为2的n次方

  • 有刷过算法题的朋友都知道,如果一个数为2的 n 次方,它的二进制表示中,只有一个数位为1,所以将问题转换为是否一个数的二进制只有一个1
  • 而判断方法很简单,利用 n & (n - 1),如果 n 的二进制只有一位1,则(n - 1)与 n 的二进制表达中没有一位是相同的,两者&运算的结果为0

2.求复杂度,有4个选项,n,n 的 n 次方,2 的 n 次方

public int Fibonacci(int n) {	
	if (n <= 0) {
		return 0;
	}
	if (n == 1) {
		return 1;
	}	
	return f(n - 1) + f(n - 2)
}

这是斐波那契数列的递归解法,是最容易想到,也最容易书写,但是复杂度很大的一种解法,网上有其他解释复杂度的博客,我就不多做重复,最终的结果是:
1.5^n <= f(n+1) <= 2^n, n>=1
一个指数级的复杂度,因此我们应该避免这种解法。
这里补充一下另外两种做法

  • 利用循环:简单好理解,直接贴出代码,复杂度降为O(n)
int f(int n) {
	if (n <= 1) {
	     return 1;
	}
    int number0 = 0, number1 = 1,  temp = 0;
    for (int i = 2; i <= n; i++) {
	    temp = number0 + number1;
        number0 = number1;
        number1 = temp;
    }
    return number1;
}
  • 用矩阵求解,博主对这种解法还不够理解,这里贴出一个其他人的做法:https://blog.csdn.net/beautyofmath/article/details/48184331

3.考察了平衡二叉树和红黑树区别
4.考察了jvm的自动装箱
5.操作系统中的,死锁的必要条件

  • 互斥条件:每个资源要么已经分配给了一个进程,要么就是可用的
  • 占有和等待条件:已经得到某个资源的进程可以再请求新的资源
  • 不可抢占条件:已经分配给一个进程的资源不能被强制性地抢占,它只能被占有它的进程显示地释放
  • 环路等待条件:死锁发生时,系统中一定有由两个或两个以上的进程组成一个环路,该环路中每个进程都在等待下一个进程所占有的资源

6.考察了集合类的区别

  • 主要考察底层的实现是链表还是数组的问题

7.线程安全

  • 常见的线程安全集合的记忆方法:喂,SHE(vector、stack、hashtable、Enumeration)
    -StringBuffer 线程安全 StringBuilder 线程不安全

你可能感兴趣的:(面试笔试)