視頻面試,上來就是一道算法題,LeetCode上的原題,440題(qaq,后悔當初沒寫到)
public int findKthNumber(int n, int k) { int cur=1; --k; while(k>0) { long step=0,first=cur,last=cur+1; while (first<=n) { step+=Math.min(n+1,last)-first; first*=10; last*=10; } if(step<=k) { ++cur; k-=step; }else { cur*=10; k--; } } return cur; }
然后是java的一些問答題
Map的實現方式有哪些,分別是怎么實現的?
常見的實現主要有HashMap(最常見的,內部無序的)、TreeMap(排過序的)及WeakMap(這個用於內存自動釋放的);
關於HashMap,簡單說是一個線性的數組結構,其中每個元素存儲的是鏈表頭結點,具體示意圖如下(圖直接在網上找的,比較形象):
HashMap里實現了一個靜態的內部類Entry,重要的屬性有key,value,next,hash。map中的數據就存儲在Entry[]中,每次我們put數據時,通過該key的hashcode,得到該key在Entry[]中的索引,然后以e.next遍歷,如果存在對應value,返回value,不存在就將其添加到Entry[]。
1.put(key,value)時,如果Entry[]的size超過threshold,則進行擴容,即table.length*2。
2.get(key) 時先定位到該數組元素,再遍歷該元素處的鏈表。
如果我們再次放入同樣的key會怎樣呢?邏輯上,它應該替換老的value。事實上,它確實是這么做的。在迭代的過程中,會調用equals()方法來檢查key的相等性(key.equals(k)),如果這個方法返回true,它就會用當前Entry的value來替換之前的value。
轉載自:https://blog.csdn.net/jiangzhongwei_/article/details/51992621
更詳細的可以參考:https://www.cnblogs.com/chengxiao/p/6059914.html
關於TreeMap:
(01) TreeMap實現繼承於AbstractMap,並且實現了NavigableMap接口。
(02) TreeMap的本質是R-B Tree(紅黑樹),它包含幾個重要的成員變量: root, size, comparator。
root 是紅黑數的根節點。它是Entry類型,Entry是紅黑數的節點,它包含了紅黑數的6個基本組成成分:key(鍵)、value(值)、left(左孩子)、right(右孩子)、parent(父節點)、color(顏色)。Entry節點根據key進行排序,Entry節點包含的內容為value。
紅黑數排序時,根據Entry中的key進行排序;Entry中的key比較大小是根據比較器comparator來進行判斷的。
size是紅黑數中節點的個數。
實現原理參考:https://www.cnblogs.com/skywang12345/p/3310928.html#a2
java回收機制是什么樣的,如何判斷一個對象是否應該被回收?