CodeTop100 Day1

临近秋招,刷一下codetop100,本文章是自己每日刷题的总结。

1、无重复字符最长字串

示例:abcabcabc   len=3

滑动窗口题,保存一个字母数组,维护左右指针,当遇到重复的,左指针右移,将移动的字符串去掉,直到满足要求,每次遍历更新答案,直到右指针为右端点,输出最大值;

2、LRU缓存

淘汰机制,去掉最不常用的

需要自己构建双向链表,创建HashMap

实现API接口:在最后位置添加结点,移除结点,移除第一个结点

实现功能:将该结点变为最近使用,添加最近使用结点,删除key,删除最久未使用

LRU功能:get方法:判断是否有该值,让该节点成为最近使用结点,返回hashmap的值

put方法:先判断是否有该键值,有的话,删除结点,然后添加到最近,没有的话,判断容量是否

超过,如果超过先将最久未使用去掉,然后添加为最近结点

3、反转链表

1 ->2->3->null

null<-1<-2<3

迭代法:创建prev结点,和cur结点,当cur结点不为空,获得cur.next结点为next,cur.next=pre,pre=cur,cur=next;返回pre

递归法:若该结点为空以及结点只有一个,直接返回该结点,否则递归head.next,传给last结点,

head.next.next=head head.next=null;返回last即可

4、数组中的第k个大元素

快排法:

查询排n-k位的数,定义左右指针,若左等于右,直接返回nums[k],这是递归出口,获得将左指针第一个数当做比标,左指针找到大于等于该数的,右指针找到小于等于该数的,交换两者,最后排出该比标的正确位置,左边是比该值小的,右边是比该值大的,如果n-k,小于第一次排后的右指针则递归区间左半部分,否则递归右半部分

小顶堆法:

使用自带的优先队列更为简单

维护k大小的小顶堆,堆的实现为数组形式,注意该i结点的孩子为 2*i+1与2*i+2,父节点为(i-1)/2

然后实现堆的上浮和下沉操作,上浮操作,如果该存入的该结点值的小于父节点就结束,否则就交换两结点,直到该下标为0,下沉操作,这里实现下沉0号位置下标,接着是实现该函数,将k个元素放入堆中,每次堆都会调制位置,如果数量大于k且该值大于堆顶元素,就下沉该值,遍历完最后返回堆顶元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值