宜信面经

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个硬币即可

猜你喜欢

转载自blog.csdn.net/huangwei18351/article/details/83443294