1.最少货币
//针对有序,直接从后边开始遍历,最大的,如果最大不满足,就往前 public static int minCoin(int g, int[] coins){ if(g < 0){ return -1; } int len = coins.length; for(int i = 1; i <= len; i++){ if(g > coins[len - i]){ int count = minCoin(g - coins[len - i], coins); if(count != -1){ return count + 1; } }else if(g == coins[len - i]){ return 1; } } return -1; } |
2.socket包含哪些内容
使用ip地址标记一个主机,使用端口号标记一个应用程序;
InetAddress:用于标识网络上的硬件资源。说白了它主要标识IP地址等相关信息
URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
Socket:使用TCP协议实现网络通信的Socket相关的类
Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信
服务端步骤:
1.创建服务器端的ServerSocket对象,绑定监听端口
2.调用accept()方法进行侦听客户端的请求,等待客户端的连接
3.与客户端建立连接以后,通过输入流读取客户端发送的请求信息
4.通过输出流用来响应客户端
5.关闭输入输出流以及socket等相应的资源
客户端步骤:
1.创建socket对象,并且指明需要连接的服务器端的地址以及端口号,用来与服务器端进行连接
2.连接建立后,获取一个输出流,通过输出流向服务器端发送请求信息
3.通过输入流,读取服务器端响应的信息
4.关闭相应的资源
通信过程
1.服务器端创建ServerSocket,循环调用accept()方法等待客户端连接。当然由于我们要实现多客户端的通话,也就意味着我们循环等待客户端的连接
2.每当客户端创建一个socket并请求和服务端连接,服务器端就会产生一个专门的线程,来响应该客户与之通信
3.服务器端接收请求,创建socket与该客户进行连接
4.建立连接的两个socket在一个单独的线程上对话,而同时服务器本身在启动线程以后,马上又会进入侦听状态
5.服务器继续等待新的连接
4.error能不能应不应该被捕获
Error的情况,合理的应用程序不应该尝试捕获的严重问题
Error是可以被捕获的,他和Exception属于同级别;但是一般不进行捕获
5.synchronized与lock的区别
介绍synchronized和lock的实现原理;
区别:synchronized是用于少量同步上,lock可以用于大量同步;synchronized在jvm对象头中实现同步,系统监控锁,lock是使用代码实现的;synchronized线程发生异常的时候,jvm会让线程释放锁。Lock需要在finally中释放锁;synchronized中如果a线程获得锁,b线程则处于等待;但是lock可以有定时锁和中断锁操作,不用一直等;
6.concurrenthashmap保证插入删除的安全性
ConcurrentHashMap室友segment数组和hashEntry数组结构组成的。Segment是一个可重入锁,在ConcurrentHashMap中扮演锁的角色;HashEntry则用于存储键值对数据。每个segment的结构包含着一个HashEntry数组;当对HashEntry数据进行修改的时候,首先要获得segment锁;
它不会对Segmengt 数量增大,只会增加Segmengt 后面的链表容量的大小。即对每个Segmengt 的元素进行的ReHash操作。
Put方法,key和value都不能为空,通过segmentShift和segmentMask进行定位segment,并且使用tryLock方法获取锁,之后判断是否对segment中的HashEntry进行扩容,以及定位要插入的位置,然后插入元素。
7.海盗分金币
1 |
2 |
3 |
4 |
5 |
0 |
0 |
100 |
0 |
0 |
0 |
98 |
0 |
1 |
1 |
97 |
0 |
1 |
2 |
0 |
97 |
0 |
1 |
0 |
2 |
4号:如果3号死了,那么4号必死无疑,因为5号可以把4号进行投票,4号死亡,因此4号不能让3号死了,即使没有金币,也只能投给3号;
3号:了解4号的想法之后,3号分配 100 0 0
2号:了解3号想法之后,为了推翻3号想法,可以分给4号和5号一人一个金币,这样比3号分配的多,愿意投给2号,这样2号自己得到98个金币
1号:了解2号的想法之后,1号不给2号金币,给3号一枚金币,得到3号的票数,接下来只要得到4号5号其中一人的投票即可;所以给4号或者5号其中一个2个硬币即可