题解 | #LRU算法实现#

设计LRU缓存结构

http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61

整个算法采用顺序编程的方式,主要是依靠字典a进行数据查找,依靠双向链表删除和插入与缓存数据相关的节点,缺陷是没有引入结构化编程的思想,优势是对于初学者来说相对直观。
func LRU( operators [][]int ,  k int ) []int {
	// write code here
	var get []int
	a:=make(map[int]int)
	var head *node
	var tail *node
    var pre  *node
    var point *node
	for _,v:=range operators{
		if v[0]==1{
			if len(a)<k{
				a[v[1]]=v[2]
			}else{
				delete(a,(*tail).Key)
				a[v[1]]=v[2]
				tail=(*tail).Pre
				(*tail).Next=nil
			}
			point=new(node)
			(*point).Key=v[1]
			if head ==nil{
				head=point
			}else{
				(*point).Next=head
				head.Pre=point
				head=point
			}
			for (*point).Next!=nil{
				point=(*point).Next
			}
			tail=point
		}else{
			if _,ok:=a[v[1]];ok{
				get=append(get,a[v[1]])
				point:=head
				for (*point).Key!=v[1]{
					point=(*point).Next
				}
				// remove point
				if point !=head{
                    pre=(*point).Pre
					if point!=tail{
						next:=(*point).Next
						(*next).Pre=pre
						(*pre).Next=next
					}else{
						pre.Next=nil
						tail=pre
					}
					// insert point to head
					(*head).Pre=point
                    (*point).Next=head
					(*point).Pre=nil
					head=point
				}
			}else{
				get=append(get,-1)
			}
		}
	}
	return get
}

type node struct {
	Key    int
	Pre    *node
	Next   *node
} 
全部评论

相关推荐

秋盈丶:后续:我在宿舍群里和大学同学分享了这事儿,我好兄弟气不过把他挂到某脉上了,10w+阅读量几百条评论,直接干成精品贴子,爽
点赞 评论 收藏
分享
吴offer选手:学到了,下次面试也放张纸在电脑上,不然老是忘记要说哪几个点
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务