宜信面經
1.最少貨幣
//針對有序,直接從後邊開始遍歷,最大的,如果最大不滿足,就往前 public static int minCoin(int g, int[] coins){ if(g < 0){ return -1; } int 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個硬幣即可