トピック住所:https://leetcode-cn.com/problems/lfu-cache/submissions/
クラスLFUCache { プライベート 静的 クラスノード{ 公共の int型キー= -1 ; 公共 int型の値= -1 ; 公共ノードの次。 公共ノードLNEXT。 公共ノードlBefore。 公共 int型のカウント= 1 ; } プライベート int型の容量; プライベート int型のサイズ。 プライベート int型 = 15 tabSize 。 プライベートノードhashTab []; プライベートノードヘッド。 プライベートテイルノードと パブリック LFUCache(int型の容量){ この .capacity = 容量; //はハッシュマップが実装参照、そうでない場合、+1でなければならない7、キー= 7意志アレイ境界場合。 HashTab = 新しい新しいノード[TabSize + 1 ]; ヘッド = 新しい新しいノード(); 尾 = 新しい新しいノード(); head.lNext = 尾; tail.lBefore = ヘッド; } 公共 int型の GET(INT キー){ int型ハッシュ= ハッシュ(KEY)、 ノードnode =hashTab [ハッシュ]。 一方、(!ノード= NULL ){ 場合(node.key == キー){ node.count = node.count + 1 。 ノードnodeNext = node.lNext。 (node.lBefore、node.lNext)接続。 更新(ノード、nodeNext)。 返すnode.value; } ノード = node.next。 } 戻り -1 。 } 公共 ボイド置く(int型のキー、int型の値){ 場合(容量== 0){ 返します。 } ensureCapacity(キー)。 int型のハッシュ= ハッシュ(キー); ノードnode = hashTab [ハッシュ]。 もし(ノード!= NULL ){ 場合(node.key == キー){ node.value = 値。 node.count = node.count + 1 。 (node.lBefore、node.lNext)接続。 更新(ノード、尾)。 } 他{ ノード最後 = ノード。 ノード= node.next。 一方(ノード!= NULL ){ 場合(node.key == キー){ node.value = 値。 node.count = node.count + 1 。 (node.lBefore、node.lNext)接続。 更新(ノード、尾)。 破ります; } 最後 = ノード。 ノード = node.next。 } であれば(ノード== NULL ){ ノード= 新しいノード()。 node.key = キー。 node.value = 値。 last.next = ノード。 サイズ ++ ; 更新(ノード、尾)。 } } } 他{ ノード = 新しいノード()。 node.key = キー。 node.value = 値。 サイズ ++ ; hashTab [ハッシュ] =ノード。 更新(ノード、尾)。 } } 公共 ボイド更新(ノードノード、ノード現ノード){ 前に、ノード = currentNode.lBefore。 しばらく(!前= nullを!&&前= ヘッド){ 場合(before.count> node.count){ 破ります。 } 前 = before.lBefore。 } (ノード、前、before.lNext)を挿入します。 } パブリック ブール containKey(INT キー){ int型のハッシュ= ハッシュ(キー)。 ノードnode = hashTab [ハッシュ]。 一方、(!ノード= NULL ){ 場合(node.key == キー){ 戻り 真。 } ノード = node.next。 } を返す 偽。 } 公共 ボイド ensureCapacity(INT キー){ 場合(サイズ<容量||(サイズ==容量&& containKey(キー))){ 返します。 } サイズ - 。 ノードdelNode =tail.lBefore; 前ノード = delNode.lBefore。 (前に、尾)接続します。 int型のハッシュ= ハッシュ(delNode.key)。 ノードnode = hashTab [ハッシュ]。 もし(node.key == delNode.key){ hashTab [ハッシュ] = node.next。 返します。 } ノード最後 = ノード。 ノード = node.next。 一方(ノード!= NULL ){ 場合(node.key == delNode.key){ last.next =node.next; } 最後 = ノードと、 ノード = node.next; } } 公共 のintハッシュ(INT キー){ // より均一に分布&使用して高効率-12 N電力計算 戻り Math.absを(キー)&TabSize; } 公共 ボイド接続(ノードの前に、ノードの後に){ before.lNext = 後、 after.lBefore = 前; } 公共 ボイドINSERT(後に、前に、ノードのノードのノードを挿入){ insert.lNext =後; insert.lBefore = 前; before.lNext = 挿入します。 after.lBefore = 挿入します。 } パブリック 静的 ボイドメイン(文字列[]引数){ LFUCacheキャッシュ = 新しい LFUCache(2 )。 cache.put( 1,1 )。 cache.put( 2,2 )。 cache.put( 3,3 )。 System.out.println(cache.get( 1 ))。 System.out.println(cache.get( 2 ))。 System.out.println(cache.get(3 ))。 } } / ** *あなたのLFUCacheオブジェクトがインスタンス化され、などと呼ばれます: * LFUCache OBJ =新しいLFUCache(容量); * int型PARAM_1 = obj.get(キー); * obj.put(キー、値); * /