临近秋招,刷一下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且该值大于堆顶元素,就下沉该值,遍历完最后返回堆顶元素