当年毕业一心想做Android开发,阴差阳错进入通信行业。四年前面试过网易有道,没有去成,心里觉得还是比较可惜的。否则现在就是安卓开发工程师了。

已经很久不开发安卓了,现在发出来面试过程,对刚入职场的程序员有点帮助。四年了,不违反职业道德了。


Android应用开发工程师J2475(网易有道招聘)

工作地点: 广州市

工作性质:全职

招聘人数:若干

发布时间:2014-06-25

职位描述:

1. Android客户端产品的设计和开发;

2. 新技术的学习,调研,实验;

3. 将原型系统转换为实际的产品;

4. 已有产品技术难题的解决。

资格要求:

1. 具有211重点大学计算机及相关专业学士及以上学历;

2. 对技术充满热情,勇于尝试,有较强创新的能力;

3. 较强的编程能力,具备良好的编程习惯;

4. 精通Java编程; (至少看过一遍java编程思想,读过之后java水平初级到入门级别)

5. 精通GUI编程,熟悉网络编程技术;(javascript 调用android的控件)

6. 能够编写高质量测试用例和技术文档;

7. 对Android应用开发具有浓厚兴趣。



网易有道广州招聘,在广州市天河区高唐新建区东部网游动漫大楼05栋2楼,前台小妹嘴上有颗大痣,看进出记录,今天除了我只有另一个人进行面试,它面试时间45分钟,2:30到3:15,我4:00开始

1、说开发过播放器,问有没有编写自己的解码器,是否用过NDK

2、是否会用js调用本地的android控件

3、hashmap与map的区别,什么是hashmap

4、arraylist和linklist的区别

5、说开发分组app,问公司数据通过百度推送发送,是否安全,拨vpn进行路由器操作是否安全

6、女友短信,用uri调用,和自己写的发送,怎么选的,为什么只用uri不自己写发送短信的程序

7、有没有写过自己的控件,viewgroup怎么理解

8、主线程和后台线程的区别,为什么要分主线程和后台线程

9、activity的生命周期

10、如果我要计算一个activity显示的时间长度,怎么计算?

11、192.168.0.1不适用split函数和ParseInt函数,如何判断一个字符串是否是ip地址,ip数值是0~255(查看代码风格)


java不行,得多看java编程思想,多看源码,asyntask什么的

10月9日下午三点,在高塘进行第二轮面试,经理电话面试

下午三点在会议室面对一个座机:

自我介绍一下

做过什么项目介绍一下,我回答有分组网APP,女友短信

你的定时短信和其他短信有和区别?我回答的是女友短信 在交互方面,配色设计,需求方面不同

还有其他项目吗?我回答分组网APP,介绍了一下告警,大客户专线信息等,貌似面试官兴趣不大

这个项目是你的兴趣还是公司的项目?回答是自我兴趣,想要推广阻力比较大,VPN的安全问题等,目前是提高了维护的工作效率,时时可以查看设备情况。

然后问了一些专业问题,301,302知道是什么吗?

TCP和UDP的区别

TCP和HTTP的区别

进程和线程的区别

close,wait状态解释一下,这个我回答的是TCP的状态,具体没太了解(都怪自己本科的时候看到tcp状态图就不想了解)


之后拿笔纸做了三道题,都是算法相关的,答得不太好

1、54张牌,分成两堆,求大王小王同在一堆的概率

2、N个数字,找出其中最大的K个点,要时间复杂度最低的方法

3、和上题类似,一个二维平面中 N个点,求斜率最大的两个点

4、一个链表,出现环的情况下,一般是最后一个节点没有指向NULL,而是指向了之前的一个节点,找出一个时间复杂度最低的方法判断是否有环。


前面答得一般,后面笔试一塌糊涂,

1、概率题没算出来

2、说用快速排序算法,复杂度是多少说了个大概N倍的Log (排n个数是nlogn,那么排前K个数呢?)

3、for循环两遍,时间复杂度o(N2),找时间复杂度更低的方法,说找x相近的点,面试官问y点呢?我说就找y/x相对于0点的斜率相近的

4、链表我用数组记录每个节点的地址,每次遍历都向前对比是否有重复地址,就可以查找出是否有环,还说如果遍历的时候有死循环,设备CPU,内存使用率会变大,都没有说出点子,最后问面试官方法,面试官说用两个指针,一个每次走一步,一个每次走两步,如果有环,总会相遇的。



解答:

1、HTTP状态:301,302

301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:

301 redirect: 301 代表永久性转移(Permanently Moved)。

302 redirect: 302 代表暂时性转移(Temporarily Moved )。

301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。

2、TCP和UDP的区别


TCP(Transmission Control Protocol,传输控制协议)是可靠的,面向连接,三次握手,四次挥手

UDP(User Data Protocol,用户数据报协议)不可靠,不面向连接的

3、TCP和HTTP的区别

http是超文本传输协议,应用层协议,基于tcp的连接方式

TCP是运输层协议,面向连接

4、进程和线程的区别,线程共享什么资源?

进程是一个可拥有资源的独立单位,进程又是可独立调度和分派的基本单位。

如果操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么,在操作系统中引入线程,则是为了减少程序在并发执行时所付出的时间开销,使OS具有更好的并发性。

进程(英语:process),是计算机中已运行程序的实体。

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

1. 进程:程序的一次执行

2. 线程:CPU的基本调度单位

进程的内存空间是共享的,每个线程都可以使用这些共享内存。

同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。

5、tcp 的状态close_wait状态解释一下

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

解决办法:有两种措施可行

一、解决:

原因是因为调用ServerSocket类的accept()方法和Socket输入流的read()方法时会引起线程阻塞,所以应该用setSoTimeout()方法设置超时(缺省的设置是0,即超时永远不会发生);超时的判断是累计式的,一次设置后,每次调用引起的阻塞时间都从该值中扣除,直至另一次超时设置或有超时异常抛出。

比如,某种服务需要三次调用read(),超时设置为1分钟,那么如果某次服务三次read()调用的总时间超过1分钟就会有异常抛出,如果要在同一个Socket上反复进行这种服务,就要在每次服务之前设置一次超时。

二、规避:

调整系统参数,包括句柄相关参数和TCP/IP的参数;

当客户端因为某种原因先于服务端发出了FIN信号,就会导致服务端被动关闭,若服务端不主动关闭socket发FIN给Client,此时服务端Socket会处于CLOSE_WAIT状态(而不是LAST_ACK状态)。通常来说,一个CLOSE_WAIT会维持至少2个小时的时间(系统默认超时时间的是7200秒,也就是2小时)。如果服务端程序因某个原因导致系统造成一堆CLOSE_WAIT消耗资源,那么通常是等不到释放那一刻,系统就已崩溃。因此,解决这个问题的方法还可以通过修改TCP/IP的参数来缩短这个时间,于是修改tcp_keepalive_*系列参数:

tcp_keepalive_time:

/proc/sys/net/ipv4/tcp_keepalive_time

INTEGER,默认值是7200(2小时)

当keepalive打开的情况下,TCP发送keepalive消息的频率。建议修改值为1800秒。

6、54张牌,分成两堆,大王小王分在一起的概率?

C(2,2)C(52,25) *2 / C(54,27)

= [52!/(25!27!)*2]/[54!/(27!27!)] = 26/53


7、找出n个数字中前k个最大的数,时间复杂度最低(编程之美上的题目)

方法一、

快速排序法或堆排序,排列n个数,变成有序数列后,求前k个数字,时间复杂度o(nlogn)+o(k) = o(nlogn)

冒泡排序,或者选择排序,只排前k个,时间复杂度o(n*k)

根据nlogn 与 K的大小决定选择部分排序还是全排序

方法二、(prune and search 剪枝搜索算法)

N个数字存储在数据S中,从s中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中元素大于等于x,Sb中元素小于x

有两种可能性:

1、Sa中元素的个数小于K,Sa中所有的数和Sb中最大的K-|Sa| 个元素(|Sa|指Sa中元素的个数)就是数组S中最大的K个数

2、Sa中元素的个数大于或等于K,则需要返回Sa中最大的K个元素

递归分解问题,平均时间复杂o(N*logK)

方法三、

前K个数建立一个小根堆,第K+1个数和小根堆的顶点对比,如果小于顶点,则小根堆不变,若大于顶点,则更新堆

方法四、

N个数都是正整数,用a[N]记录每个数字出现的次数,比如数字出现3,对 a[3]++ ,扫描一遍后,找最大的K个数字

8、一个二维平面中 N个点,求斜率最大的两个点【平面上N个点,每两个点都确定一条直线,求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。】

按x的值排序,求相邻的点的斜率,找出最大值。

理论依据:假如斜率最大的两点是a,b,并且a,b不相邻,那么一定可以找出点c,使得ac或bc的斜率>=a,b的斜率

3个点A,B,C,把它们的按x坐标排序。假设排序后的顺序是ABC,那么有两种情况:

1.ABC共线,则k(AB)=k(BC)=k(AC)

2.ABC不共线,则ABC将形成一个三角形,那么k(AC)<max(k(AB), k(BC))

其中k()表示求斜率。

所以程序的基本步骤就是:

1.把N个点按x坐标排序。o(nlogn)

2.遍历,求相邻的两个点的斜率,找最大值。o(n-1)

时间复杂度哦 o( Nlog(N) )+o(N-1) = o(Nlog(N))

9、一个链表,出现环的情况下,一般是最后一个节点没有指向NULL,而是指向了之前的一个节点,找出一个时间复杂度最低的方法判断是否有环。消除环并倒置出现环位置的链表

答:因为出现环,所以会有两个指针指向同一个节点,也就是说地址相同。取指针p1,p2,遍历链表,指针p1每次走一步,p2每次走两步,如果存在环,则遍历一遍的时候一定会导致p1==p2,即可证明有环。类似追击问题

倒置链表,用头插法即可。

http://www.nowamagic.net/librarys/veda/detail/1811

10、android 主线程 和后台线程的区别,为什么要分主线程和后台线程

android UI操作不是线程安全的。

线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

不需要考虑同步问题就是线程安全的。

UI线程更新界面,超过5s的耗时操作都会导致”application not responding” ,所以在后台线程进行下载、数据库查询等超时操作。

11、如何计算activity显示的时间

Activity生命周期需要牢记。

onStart就开始显示activity的界面了,在这个状态开始计时

12、hashmap与map的区别,什么是hashmap

map是一个接口,而HaspMap是它下面的一个实现类

13、HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

1)HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行

2)HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable

3)HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。

4)由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。

http://www.importnew.com/7010.html

14、arraylist和linklist的区别

数组和链表的区别


其他:

1、说开发过播放器,问有没有编写自己的解码器,是否用过NDK

2、是否会用js调用本地的android控件

 




0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注