富途移动端面试回忆

这几天深圳的天气异常的奇怪,平时一向好天气的深圳,接连几天天气都灰蒙蒙的。一出门就好像行走在巨大的桑拿房里,晚上夜跑的时候更是汗如雨下,没办法,毕竟是渣渣,还是找工作要紧。
笔试(1h):
笔试主要是做一些基础题,主要涉及基础数学、操作系统、算法等基本知识
1:数独游戏,在9*9的数独上填充数字
2:逻辑电路的概率题
3:猴子吃桃问题
4:页面置换算法为FIFO,求缺页中断的次数
5:有7g和2g砝码,如果利用砝码和天平在3次之内将140g的面粉分为90g和50g
  • 第一次:将140g面粉分为70g和70g
  • 第二次:将70g面粉分为35g和35g
  • 第三次:利用砝码将35g面粉分为20g和15g。由此35+15 = 50g; 35+35+20 = 90g
【富途移动端面试回忆】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。

一面(部门Leader--40min):
一面主要是针对刚才的笔试题进行提问,以及抓着简历和项目经历来问
1:解释一下MVC、MVP、MVVM架构模式
2:解释一下Android组件化(LiveData + ViewModel)
3:对ios架构有了解吗?(只了解过Viper)
4:Kotlin的特点、优点和缺点
优点:
  • 完全兼容Java
  • Null safe
  • 支持lambda表达式(比Java8更好)
  • 支持扩展
  • 支持高阶函数
  • 体验一致的开发工具链
  • 代码简洁
缺点:
  • 可读性差
  • 编译速度慢
  • 操作不当容易引出大错误
  • 学习资料少
  • IDEA 自动转换工具,把 Java 转换成 Kotlin,转换质量比人工转的要差的多。
5:抓项目细节,问项目的实现
6:Android如何进行优化,如内存优化、布局优化、性能优化
布局优化:
  • 尽量减少布局文件的层级
  • 标签,主要用于布局重用,提高布局的复用性
  • 标签,一般和标签配合使用,可以减少布局的层级
  • 标签,提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,这提高了程序的初始化效率
绘制优化:
避免在View的onDraw方法中执行大量的操作
  • onDraw中不要创建新的局部变量,这是因为onDraw方法可能会被频繁的调用,这样就会在一瞬间产生大量的临时对象
  • onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作。否则这回导致View的绘制流程不流畅
内存优化:
  • 尽量使用Android特有的数据容器。如SparseArray、SparseBooleanArray
  • 不要使用过多的枚举类,枚举占用的内存空间比整形大
  • 适当使用软引用和弱引用
  • 尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露
二面(GM--45min)
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:你有什么想问我吗?

    推荐阅读