labuladong的算法小抄官方完整版-已压缩.pdf.zip
1、判断一个单词是否是回文?
回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。 例如:man,mamam,313
进阶
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
你能不将整数转为字符串来解决这个问题吗?
示例 1: 输入: 121 输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
func palindrome( _ num: Int) -> Bool {
/*
解题思路
1.首位与末尾都是相同的数
2.则后半部分进行反转之后,与前半部分数相同
3.末尾不能为0
4.如果是奇数位,需要去除中位数进行比较
*/
if num < 0 || num % 10 == 0 && num != 0 {
return false;
}
var revNum = 0;
var vNum = num;
while vNum > revNum {
revNum = revNum * 10 + vNum % 10;
vNum /= 10;
}
// 因为有奇数的情况出现,所以需要考虑去除中位数
return vNum == revNum || vNum == revNum / 10
}
2、常用缓存淘汰算法
- LRU
- 思想
- 如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最久没有访问的数据最先被置换(淘汰)
- 实现思路
- 可以用双向链表(LinkedList)+哈希表(HashMap)实现(链表用来表示位置,哈希表用来存储和查找)
- 优缺点
- 思想
LFU
- 思想
- 如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。
- 实现思路
- 考虑到 LFU 会淘汰访问频率最小的数据,我们需要一种合适的方法按大小顺序维护数据访问的频率,实现策略为小顶堆+哈希表
- 优缺点
- 思想
FIFO
- 思想(先进先出(FIFO,队列))
- 如果一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小。空间满的时候,最先进入的数据会被最早置换(淘汰)掉
实现思路
- 维护一个FIFO队列,按照时间顺序将各数据(已分配页面)链接起来组成队列,并将置换指针指向队列的队首。再进行置换时,只需把置换指针所指的数据(页面)顺次换出,并把新加入的数据插到队尾即可。
优点
缺点
判断一个页面置换算法优劣的指标就是缺页率,而FIFO算法的一个显著的缺点是,在某些特定的时刻,缺页率反而会随着分配页面的增加而增加,这称为Belady现象。产生Belady现象现象的原因是,FIFO置换算法与进程访问内存的动态特征是不相容的,被置换的内存页面往往是被频繁访问的,或者没有给进程分配足够的页面,因此FIFO算法会使一些页面频繁地被替换和重新申请内存,从而导致缺页率增加
现在不再使用FIFO算法
- 思想(先进先出(FIFO,队列))
3、爬楼梯问题
- 问题描述:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
解答:
- 斐波那契数列问题
- 使用动态规划法
规律:a[n] = a[n-1]+a[n-2]
- 使用递推调用
leetcode 70](https://leetcode-cn.com/problems/climbing-stairs/))
4、整数反转
- 问题描述:给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果
解答:
较好方案:
弹出/推入数字&溢出检查
pop操作 int pop = x % 10; x /= 10;
push操作 rev = rev * 10 + pop;
方案二:栈
5、红黄蓝三色球
问题描述:有红、黄、蓝三种颜色的气球。在牛客王国,1个红气球+1个黄气球+1个蓝气球可以兑换一张彩票。
- 2个红气球+1个黄气球可以兑换1个蓝气球。
- 2个黄气球+1个蓝气球可以兑换1个红气球。
- 2个蓝气球+1个红气球可以兑换1个黄气球。
- 现在牛牛有a个红气球,b个黄气球, c个蓝气球,牛牛想知道自己最多可以兑换多少张彩票。
解答:
- 取出a,b,c三种中最小的值+其他数量
- 若a=0,则三个黄气球 + 2蓝气球 得 一张彩票 b c
- 若b=0,则则三个蓝气球 + 2个红气球 得 一张彩票 c a
- 若c=0, 则则三个红气球 + 2个黄气球 得 一张彩票a b
- 取出a,b,c三种中最小的值+其他数量