这几天深圳的天气异常的奇怪,平时一向好天气的深圳,接连几天天气都灰蒙蒙的。一出门就好像行走在巨大的桑拿房里,晚上夜跑的时候更是汗如雨下,没办法,毕竟是渣渣,还是找工作要紧。
笔试主要是做一些基础题,主要涉及基础数学、操作系统、算法等基本知识
1:数独游戏,在9*9的数独上填充数字
2:逻辑电路的概率题
3:猴子吃桃问题
4:页面置换算法为FIFO,求缺页中断的次数
5:有7g和2g砝码,如果利用砝码和天平在3次之内将140g的面粉分为90g和50g
6:编程题 : 根据中序遍历结果和先序遍历结果建树
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
return reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);
}
private TreeNode reConstructBinaryTree(int [] pre,int startPre, int endPre, int [] in, int startIn, int endIn){
if(startPre > endPre || startIn > endIn){
return null;
}
TreeNode root = new TreeNode(pre[startPre]);
for(int i = startIn; i <=endIn; i++){
if(root.val == in[i]){
root.left = reConstructBinaryTree(pre,startPre+1,startPre+i-startIn, in, startIn,i -1);
root.right = reConstructBinaryTree(pre,startPre+i-startIn+1,endPre,in,i+1,endIn);
break;
}
}
return root;
}
}
7: 编程题:将字符串“l.am.happy”反转为“yapph.ma.I”
/**
* 两次翻转,先对每个单词进行翻转,再对整体进行翻转
*/
public String reverseString(String str){
if(str == null || str.length() == 0){
return null;
}
// 分割单词
String []wordList = str.split("/.");
for(int i = 0; i < wordList.length; i++){
// 对每个单词进行翻转
wordList[i] = convert(wordList[i]);
}
int low = 0;
int high = wordList.length - 1;
while(low < high){
String tmp = wordList[low];
wordList[low] = wordList[high];
wordList[high] = tmp;
low++;
high--;
}
StringBuffer sb = new StringBuffer();
for(int i = 0; i < wordList.length - 1; i++){
sb.append(wordList[i]).append(".");
}
sb.append(wordList[wordList.length - 1]);
return sb.toString();
}
// 对单个单词进行翻转
public String convert(String str){
int low = 0;
int high = str.length() - 1;
char[]tmpStr = str.toCharArray();
while(low < high){
char temp = tmpStr[low];
tmpStr[low] = tmpStr[high];
tmpStr[high] = temp;
low++;
high--;
}
return String.valueOf(tmpStr);
}
8: 编程题:不能使用系统函数,计算任意两个日期的天数差
9: 推导题:A、B、C、D四个人分别带着一顶帽子。共两顶黑帽子,两顶白帽子。其中D和A、B、C三个隔了一堵不透明的墙。A可以看到B、C帽子的颜色。B可以看到C帽子的颜色。只要能判断自己的帽子颜色,就可以立刻说出来。他们四人沉默了几分钟,这时候一个人说到,它知道自己帽子的颜色是什么了,请问这个人是谁?
答案:应该是B。A能看到B、C两人的帽子。如果B、C两个人的帽子颜色相同,那么A立刻就能说出来自己帽子的颜色。否则,如果A沉默,我们就能断定B、C带了不同颜色的帽子。因为B能看到C帽子的颜色,B和C帽子的颜色不同,所以,我们能够推断出B。
一面主要是针对刚才的笔试题进行提问,以及抓着简历和项目经历来问
1:解释一下MVC、MVP、MVVM架构模式
2:解释一下Android组件化(LiveData + ViewModel)
3: 对ios架构有了解吗?(只了解过Viper)
4:Kotlin的特点、优点和缺点
优点:
缺点:
5: 抓项目细节,问项目的实现
6:Android如何进行优化,如内存优化、布局优化、性能优化
布局优化:
绘制优化:
避免在View的onDraw方法中执行大量的操作
内存优化:
1: 重载和重写的区别
方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载是一类中多态性的一种表现。
override(重写):
1、方法名、参数、返回值相同。
2、子类方法不能缩小父类方法的访问权限。
3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
4、存在于父类和子类之间。
5、方法被定义为final不能被重写。
overload(重载):
1、参数类型、个数、顺序至少有一个不相同。
2、不能重载只有返回值不同的方法名。
3、存在于父类和子类、同类中。
2:Android应用的启动过程
时序图
3:TCP建立连接的过程
建立连接:
TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据
释放链接:
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
CP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
4:传输层和网络层的联系
网络层负责ip数据报的产生以及ip数据包在逻辑网络上的路由转发。
传输层提供端到端通信服务层次,提供可靠及非可靠连接。
网络层只是根据网络地址将源结点发出的数据包传送到目的结点(点到点),其主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。该层控制数据链路层与传输层之间的信息转发,建立、维持和终止网络的连接。具体地说,数据链路层的数据在这一层被转换为数据包,然后通过路径选择、分段组合、顺序、进/出路由等控制,将信息从一个网络设备传送到另一个网络设备。
而传输层则负责将数据可靠地传送到相应的端口(端到端),传输层提供了主机应用程序进程之间的端到端的服务。传输层利用网络层提供的服务,并通过传输层地址提供给高层用户传输数据的通信端口,使高层用户看到的只是在两个传输实体间的一条端到端的、可由用户控制和设定的、可靠的数据通路。
5:25匹马,5条跑道。要选出最快的前三名,最少要跑几次?
7次。将25匹马分成五批,跑五次,决胜出每批马的第一名。再让每批第一名的马跑一次,决定前三名,设为A,B,C。此时可确认跑得最快的为A,但是第二名和第三名不确定。于是可以让A1,A2, B,B1,C跑一次。(A1代表A组的第二名),决胜出前二名。就是最快的第二和第三名的马。
6:老王卖鞋,一双进价30元,老王赔本卖,只卖20元。有个骗子来买,给老王50元假钞。老王未能识别,又没有零钱,把这假钞拿到隔壁铺子的老李换了50元零钱,回来找了骗子30。隔壁很快发现问题,拿假钞来换,老王只好把自己的家底真钞50元换给隔壁。问老王损失了多少钱?
损失了60元,由题目可知老李没有任何损失。老王找了骗子30元,同时又得到了一双价值30的鞋子。赚了60元,因此可以得出老李亏了60元。
7:死锁产生的必要条件
8:多少个进程竞争多少个临界资源会产生死锁?
两个或以上进程需要两个或以上资源
9:你怎么规划你以后的发展?
(接下来巴拉巴拉一大堆产品的问题,产品的优势、竞争力等等)
Hr面(20min)
1: 自我介绍 (巴拉巴拉,刚好两分钟)
2:我看你组织过挺多公益活动,能说说具体的过程吗?
3:为什么从上一间公司辞职呢?
4:有女朋友吗?
5:你能说说你参加辩论赛的经历吗?
6:大四有课吗?九月份能过来实习吗?
7:大学的成绩
8:毕业之后,你对未来有具体的规划吗?
9:你有什么想问我吗?