1. 程式人生 > >宜信面經

宜信面經

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個硬幣即可