富途移动端面试回忆

这几天深圳的天气异常的奇怪,平时一向好天气的深圳,接连几天天气都灰蒙蒙的。一出门就好像行走在巨大的桑拿房里,晚上夜跑的时候更是汗如雨下,没办法,毕竟是渣渣,还是找工作要紧。

笔试(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建立连接的过程

富途移动端面试回忆_第1张图片

建立连接:

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:你有什么想问我吗?

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