面经1
- 给一个目标数 t,找出数组中和为t的组合(集合)有多少?
这个是很典型的贪心算法问题,代码如下
public class Mj1 {
//贪心算法,非最优解
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int target = sc.nextInt();
System.out.println(Arrays.toString(getTypes(arr,target)));
}
sc.close();
}
private static int[] getTypes(int[] arr, int target) {
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
if(target>arr[i])
break;
}
int index = 0;
while (target>0&&index<arr.length){
if(target>=arr[index]){
target-=arr[index];
res[index]++;
}else
index++;
}
return res;
}
}
求集合的算法暂时还没想到,如果可以重复使用某一个呢?求解~
- 面向对象的好处和弊端
好处:基本将继承、封装、多态讲清楚就好
弊端·知乎
- JMM,volatile关键字及其使用场景
Http协议的get、post和delete区别。
Linux命令,怎么查看cpu使用情况,cpu load的值代表啥。
查看cpu使用情况:top、cat 和free cpu load的值代表cpu的利用率
- tcp-ip模型与osi模型的区别
面经2
1.linux信号机制如何实现的?写一下伪代码?
解答:Linux信号(signal) 机制分析
2.电脑开机过程
解答:阮一峰:计算机是如何启动的
3.printf是怎么实现的?
基本上倒着来说就是printf->sprintf->用户级别的puts->sys_puts->puts->putchar方法
4.On求链表中间结点
维护两个指针,一个每次走一步,一个每次走两步,走的快的指向null的时候,此时慢的就处在mid节点。
public class Mj2 {
static class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
}
}
public ListNode getMid(ListNode head){
ListNode quick = head;
ListNode slow = head;
while (quick!=null){
if(quick.next!=null){
quick = quick.next.next;
}else {
break;
}
slow=slow.next;
}
return slow;
}
}
5.浏览器访问meituan.com的过程?
1.在浏览器输入meituan.com
2.DNS把meituan.com解析成IP,如果用户输入了端口号,则使用用户输入的端口号,否则使用默认的80端口。在解析过程中,DNS会首先通过缓存进行查找,依次按照浏览器缓存-操作系统缓存-路由器缓存-ISP DNS缓存的顺序。如果缓存中都没有记载相应的IP地址,那么DNS服务器将按照根域-顶级域-二级域-…的顺序进行递归查找,并返回查找结果。
3.浏览器向服务器发送HTTP请求
4.服务器返回一个永久重定向响应(code:301),即把meituan.com重定向成www.meituan.com
5.浏览器申请连接重定向后的地址
6.服务器响应请求,并开始向浏览器返回数据,如果资源路径不存在,那么会返回404错误
7.如果6中返回的是页面,根据页面的外链URL,再次进行获取,然后浏览器根据资源类型进行网页渲染,将网页展示给用户并响应用户的操作,在这个过程中操作是同步进行的。
6.socket是什么?端口是什么,两者有什么关系
三者从本质上来说没有可比性,
socket则是对TCP/IP协议的封装和应用(程序员层面上)。
也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,
而HTTP是应用层协议,主要解决如何包装数据。
关于TCP/IP和HTTP协议的关系,网络有一段比较容易理解的介绍:
“我们在传输数据时,可以只使用(传输层)TCP/IP协议,但是那样的话,如果没有应用层,便无法识别数据内容。
如果想要使传输的数据有意义,则必须使用到应用层协议。
应用层协议有很多,比如HTTP、FTP、TELNET等,也可以自己定义应用层协议。
WEB使用HTTP协议作应用层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发到网络上。”
而我们平时说的最多的socket是什么呢,实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。
通过Socket,我们才能使用TCP/IP协议。
实际上,Socket跟TCP/IP协议没有必然的联系。
Socket编程接口在设计的时候,就希望也能适应其他的网络协议。
所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,
从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。
网络有一段关于socket和TCP/IP协议关系的说法比较容易理解:
“TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。
这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,
TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。”
7.手写代码题:一个动态规划,一个dfs(写了很久。)
8.笼统问题
介绍下在头条实习都干了什么项目中遇到的难点最近读了什么技术书籍?我说了三本,面试官一本一本问,要求介绍具体内容你大学期间自己做过的印象最深的一件事答:1、自己写的ipl成功引导启动了linux kernel2、修改linux0.11源码,添加了两个系统调用你对你的第一份工作有什么期望你有什么问题要问我?谈谈你的职业规划,和最近在看哪方面的书?
面经3
1.TCP的连接和断开过程(这个比较基础),深入问了为什么断开的时候服务器端不是一次性向客户端发完应答,而是连续发两次信息?(这个真心不会)
TCP的连接和断开过程就是三次握手,四次挥手
2.数学题:0-9999中数字出现6的个数,(每个数中出现多个6需要进行次数累加),要求不能通过编程。
总共有四位数,每位数的可能分别有10种(0~9)。
每一个位,都会出现0-9的交替,实际上在出现6这个角度,各个位是一样的。
现在假设个位固定为6,那么其他的位数的变化数量是10 * 10 * 10 = 1000种。
就是说数字6在个位出现的次数为1000。
以此类推,数字6在十位、百位、千位出现的次数也是1000。
故答案为 4 * 1000 = 4000
4.25匹马选出跑的最快的3匹马,最少需要多少次.
七次。思路&证明。
<step1>把25匹马分为五组进行比赛,每一组都按成绩编号,1>2>3>4>5。可淘汰每一组的4,5,故现在还有15匹马待选。 这样已经比赛5次。
<step2>把每一组的第一名挑选出来比赛,a1>b1>c1>d1>e1,则d,e组都可以淘汰。现在还有九匹马待选。这样已经比赛6次。
<step3> a123 b123 c123 由1和2中步骤知上表中a1一定最快,a2,b1可能可以竞争第二名的位置,a3,b2,c1可以竞争第三名,如此,其余的马匹被淘汰。让a2,b1,a3,b2,c1这5匹马比赛即可确定第二名,第三名。
这样一共比赛7次。
5.java基础 垃圾回收机制,讲一些算法
解答:java垃圾回收机制
6.hashMap与hashtable 还有并发集合
解答:彻底搞懂HashMap,HashTable,ConcurrentHashMap之关联.
7.http基础(三次握手,代理,缓存机制,method)
Android相关面试题
鸿洋微信公众号
1.java的数据类型
void byte short int long char float double boolean
2.重载和重写的区别
重载
1.方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数存在,具有不同的参数/类型,重载Overloading是java的一个类的多态性的一种体现。
2.java中方法的重载,就是在java的同一个类中,创建多个方法,他们具有相同的方法名,但是有不同的参数和不同的定义,调用方法时通过传递给他们不同的参数个数和参数类型来决定具体使用哪个方法,这个就是多态性。
- 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准.
重写
1.父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
方法重写又称方法覆盖。
2.若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
3.子类函数的访问修饰权限不能少于父类的;
3.抽象类和接口的区别
4.final关键字可以修饰什么,作用什么
final关键字可以修饰java的类,方法,属性
1.final修饰类,从而这个就不可以被继承,例如String,StringBuffer或者System类
2.final修饰方法,这个方法不能被重写,例如OIbject类的getClass方法
3.final修饰属性,这个属性就是一个常量,通常是大写--即该变量不能使用默认初始化。可以显示的赋值,代码块,构造器。
- java权限的四种不同
public protected private default 区别
类别 public protected default private 同一个类 √ √ √ √ 同一个包 √ √ √ 子类 √ √ 不同包
6.Android中Handler的作用?
实现异步的消息处理机制。包含线程队列和消息队列
1.运行在某个线程上,共享线程的消息队列
2.接收消息、调用消息、派发消息和处理消息
3.实现消息的异步处理
具体内容
7.Activity生命周期 和四种启动方式
四种启动模式的应用,试举例。
- Fragment的生命周期
更多可见洋神博客
9.listView优化
- 重用convertView
- 使用ViewHolder
- 图片三级缓存
- 监听滑动事件,滑动的时候不加载数据
- 开启硬件加速
<activity android:hardwareAccelerated="true" ...>
10.Android内存泄漏,举个例子
Java内存泄漏引起的主要原因:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏
Java内存分配策略:
静态存储区:又称方法区,主要存储全局变量和静态变量,在整个程序运行期间都存在
栈区:方法体的局部变量会在栈区创建空间,并在方法执行结束后会自动释放变量的空间和内存
堆区:保存动态产生的数据,如:new出来的对象和数组,在不使用的时候由Java回收器自动回收Android中内存泄漏的例子:
- 单例造成的内存泄漏: 在单例中,使用context.getApplicationContext()作为单例的context
匿名内部类造成的内存泄漏:由于非静态内部类持有匿名外部类的引用,必须将内部类设置为static- Handler造成的内存泄漏:使用static的Handler内部类,同时在实现内部类中持有Context的弱引用
- 避免使用static变量:由于static变量会跟Activity生命周期一致,当Activity退出后台被后台回收时,static变量是不安全,所以也要管理好static变量的生命周期
- 资源未关闭造成的内存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要关闭
- AsyncTask造成的内存泄漏:由于非静态内部类持有匿名内部类的引用而造成内存泄漏,可以通过AsyncTask内部持有外部Activity的弱引用同时改为静态内部类或在onDestroy()中执行AsyncTask.cancel()进行修复
11.说一下Object的常见方法
clone() toString() equals() hashCode(返回对象的hash码)notify() wait()
12.ArrayList和HashMapt的底层实现,扩容原理
13.hashCode的意义,怎么重写HashCode
14.RecyclerView的缓存机制
15.Android的手势检测,事件分发
智力题&算法
- 给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字)。如何才能从这个无穷尽的流中随机的选取1000个关键字?
二叉树前中后按层遍历,怎么只遍历某一层数据。