360集团2016JAVA研发工程师内推笔试题
题目来源:牛客网 https://www.nowcoder.com/test/question/analytic?tid=21122281
1.执行以下程序后的输出结果是()
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operator(a, b);
System.out.println(a + "," + b);
}
public static void operator(StringBuffer x, StringBuffer y) {
x.append(y); y = x;
}
}
答案:
解析:
题目主要考察了JAVA方法的值传递,方法operator并没有改变a,b变量的引用值,改变的只是方法参数的引用,看下面的图解
如下图,简易画了一下,没有画出内存中的具体存储,只给出逻辑关系,可以看出operator方法改变的是a所指向的内存中的数据和方法中x,y参数的指向,并没有修改a,b的引用的值,所以选择D
2.结构型模式中最体现扩展性的模式是()
答案:
解析:
![](https://i-blog.csdnimg.cn/blog_migrate/38ed74eaab249ce01d6f6660db55e18a.png)
解析:
![](https://i-blog.csdnimg.cn/blog_migrate/725d4be730d7e7eaced237da364f0fb7.png)
解析:
再TCP中,ack确认号代表希望得到的序号,而在本题中第三次握手发送的序列号为1000,由此可以说明第二次握手的确认号为1000,同时由于第三次握手的确认号为2000,由此可以说明希望收到的序号为2000,那么证明第二次发送的序号为1999,所以选择B
5.下列TCP连接建立过程描述正确的是:
答案:
解析:
A.TCP客户端向服务端发送SYN保文端,客户进入SYN_SENT状态,不是服务端进入该状态
B.服务端在收到客户端发来的ACK确认后,同时向客户端发回ACK确认后服务端才会进入SYN_RCVD状态
D.服务端未收到客户端确认将会超时重传
6.属于网络112.10.200.0/21的地址是()
答案:
解析:
该网络使用了无分类编址CIDR,/21表示前21位为网络号,下面给出图解,如图主机号为110时IP地址为A项
7.以下java程序代码,执行后的结果是()
java.util.HashMap map=new java.util.HashMap();
map.put("name",null);
map.put("name","Jack");
System.out.println(map.size());
答案:
解析:
在JAVA中map的一个键只能够出现一次,也就是说当有一个相同的键时会进行替换,所以这个name键所对应的值为Jack,所以map大小为1
8.以下java程序代码,执行后的结果是()
public class Test {
public static void main(String[] args) {
Object o = new Object() {
public boolean equals(Object obj) {
return true;
}
};
System.out.println(o.equals("Fred"));
}
}
答案:
解析:
上述代码中重写了equals方法,方法接收参数直接返回true,不进行判断,所以选择B
9.代码片段:
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
答案:
解析:
在java中没有使用final修饰的变量会被自动转型,byte-->int,而使用了final修饰就不会被转型,所以b6=b4+b5;是正确的,而b3=(b1+b2); 由于b1,b2没有使用final修饰在运算过程中会被自动转型为int,结果为int类型,赋值给byte,大范围赋值给小范围变量会出现编译错误。
10.下面代码运行结果是()
public class Test{
public int add(int a,int b){
try {
return a+b;
}
catch (Exception e) {
System.out.println("catch语句块");
}
finally{
System.out.println("finally语句块");
}
return 0;
}
public static void main(String argv[]){
Test test =new Test();
System.out.println("和是:"+test.add(9, 34));
}
}
答案:
解析:
在try...catch...finally语句中,finally无论是否发生异常都会被执行,并且发生在return之前。
![](https://i-blog.csdnimg.cn/blog_migrate/46ad32914e267a38e02512ce0ac6a716.png)
解析:
对于这个题目,没有仔细了解过TCP的RST重置的出现条件,下面是看他人给的解释,需要记一下(以下四种情况会发送RST包)
1、端口未打开
2、请求超时
3、提前关闭
4、在一个已关闭的socket上收到数据
![](https://i-blog.csdnimg.cn/blog_migrate/5bc1649a90a36cf5f7db6cd7bfe4e00c.png)
解析:
这个题目是一个简单的逻辑题目,可以使用离散数学的知识,也可以直接推断一下即可
13.下列关于静态工厂和工厂方法表述错误的是:()
答案:
解析:
开闭原则:对扩展开放,对修改封闭。静态工厂增加需要是修改源代码,对修改不封闭,不符合开闭原则。
14.设有一个用数组Q[1..m]表示的环形队列,约定f为当前队头元素在数组中的位置,r为队尾元素的后一位置(按顺时针方向),若队列非空,则计算队列中元素个数的公式应为()
答案:
解析:
这个题目是由于不认真导致的,用尾减去头,加m的原因是防止尾大于头,(rear - front + m)% m
15.以下程序是用辗转相除法来计算两个非负数之间的最大公约数:
long long gcd(long long x,long long y){
if(y==0)
return x;
else return gcd(y,x%y);
}
答案:
解析:
辗转相除法时间复杂度为logn
16.计算斐波那契数列第n项的函数定义如下:
int fib(int n){
if(n==0)
return 1;
else if(n==1)
return 2;
else
return fib(n-1)+fib(n-2);
}
若执行函数调用表达式fib(10),函数fib被调用的次数是:
答案:
解析:
C(0) = 1
C(1) = 1
C(2) = 1+1+1 = 3
c(3) = 3+1+1 = 5
c(4) = 5+3+1 = 9
...
c(9) = 67+41+1 = 109
c(10) = 109+67+1 = 177
17.设图G的相邻矩阵如下图:则G的顶点数和边数分别为:
0 1 1 1 1
1 0 1 0 0
1 1 0 1 1
1 0 1 0 1
1 0 1 1 0
答案:
解析:
图的邻接矩阵是一个长宽相等的矩阵,边长代表顶点的个数,矩阵中的1代表两点之间有边相连,矩阵中一共有16个1,所以只有8条边,因为1--2相连,那么2--1也一定相连,可以看一下数据结构就可以理解了。
小白创作,大佬勿喷,谢谢合作