电话面试问了几道题,我把能记起来的记录一下吧
1.升序降序数组查找最大值
两种方案吧
第一种遍历一次,找到开始变小的那个i,a[i-1]就是最大值,复杂度O(n);
第二种,二分法,先去中间的三个值,判断这三个值是否单调,如果不是单调,中间那个就是最大值,否则根据单调方向,找到下一段数组进行二分查找。复杂度O(logn)。第二种肯定最好噻,代码如下:
public class Main {
public static void main(String[] args) {
int[] attr = { 1, 2, 3, 5, 9, 6, 4 };
System.out.println(find(attr));
}
public static int find(int[] attr) {
int s = 0;
int e = attr.length;
while (s <= e) {
int m = (s + e) / 2;
if (m == s || m == e - 1) {
return m;
}
if (attr[m] >= attr[m - 1] && attr[m] >= attr[m + 1]) {
return m;
} else if (attr[m] < attr[m - 1]) {
e = m - 1;
} else if (attr[m] > attr[m - 1]) {
s = m + 1;
}
}
return -1;
}
}
2.什么叫内存对齐
按照数据成员的声明的顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。以4字节对齐为例,取最大成员类型倍数,如果超过4字节,都以4字节整数倍为基准对齐。
https://blog.csdn.net/shi2huang/article/details/80290192
3.简述进程和线程的区别
进程是程序的一次执行。 线程可以理解为进程中执行的一段程序片段。
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除。 线程占
用的资源要少于进程所占用的资源。 进程和线程都可以有优先级。
没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
4.简述TCP的三次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据。