参加了头条的Android 的一面 做一个小的总结
1手写算法 题目求: -1 2 3 -5 -7 -8 6 5 3 1 -5 8 的最大子串 (要求子串连续 且相加值为所有字串的最大)
面试时想出的算法就是
int []array={-1, 2, 3, -5, -7, -8, 6, 5, 3, 1, -5, 8};
int max=array[0];
for(int i=0;i<array.length;i++)
{
int sum=0;
for(int j=i+1;j<array.length;j++)
{
sum=sum+array[j];
if(sum>max) max=sum;
}
}
system.out.println(max);
但是面试官说事件复杂性太高 要求优化,当时没有想到好的方法。
后来分析得到更好的算法
public int FindGreatestSumOfSubArray(int[] array) {
int max=Integer.MIN_VALUE;
int sum=0;
for(int i=0;i<array.length;i++)
{
sum+=array[i];
if(max<sum) max=sum;
if(sum<0) sum=0;
}
return max;
}
算法题考察了这一道
其余的知识点
1jvm的内存怎么分配的
2jvm的gc机制以及相关算法
3引用的简介 弱引用的死亡时间
4HashMap的原理
5 怎么解决hashmap不安全的问题 以及对hashmap加synchronized锁的负面影响,以及怎么消除
6 tcp的三次握手,四次挥手,tcp报文格式
7synchronized 和lock的区别
8Android 的view 绘制流程 以及详细解释 onmeasure onlayout ondraw的实现