一、删除相邻字符串问题
题目:
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
提示:(这好像没啥用,代码只是简单校验了下)
1 <= S.length <= 20000
S 仅由小写英文字母组成。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
答:
二、不相邻房间偷盗金额最大问题
题目:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间
相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例:
[1, 3, 4, 5, 8] 5个房间,房间1金额1,房间2金额3...偷盗最大金额为房间3金额4加上房间5金额8,最大偷盗金额12;[2,5,1,6,9]最大偷盗金额为14。
分析:
问题实质解决数组中一对或多对不相邻元素求和的最大值,考察动态规划(dynamic programming),当前子问题的解由上一次子问题的解推出。
答:
[refer](https://yq.aliyun.com/articles/3521)
三、Redis雪崩、穿透和击穿
redis雪崩:redis缓存设置的key在同一时间大批量过期,导致每次都命中数据库。
redis穿透:请求的数据没有设置redis缓存,即拿一个不存在的key去redis中取,最后也是都命中数据库。
redis击穿:去redis中获取的是一个热key,在这个时间点正好key过期了,每次请求获取这个key时都会请求到数据库。
解决方法:key过期时间均匀分配,按优先级分配;设置二级缓存;给不存在的key设置一个值;使用bloom过滤等
[refer](https://blog.csdn.net/qq_37606901/article/details/79569250)
四、redis集群一致性
CAP定理:
分布式系统的三个指标:
Consistency([kənˈsɪstənsi])一致性:服务器1有个记录v0,用户发起写操作改为v1,此时用户请求服务器1或2中的这条记录读到的是v1,这种情况符号一致性。
Availability([əˌveɪlə'bɪləti])可用性:只要收到用户的请求,服务器就应该给出应答,即可用性。若用户对服务器1的记录v0改为v1,此时服务器2中v0这条记录被锁 住,还未更新成v1。用户请求服务器2的v1记录,服务器2未给出应答,此时就不符合可用性了。
Partition tolerance([pɑːˈtɪʃn] [ˈtɒlərəns] )分区容错:分布式系统中存在多个子网络,每个子网络成为一个区间。区间通信可能失败,服务器1给服务器2发消息,服务器2可能收不到,这种情况称为分区容错,无法避免。因此,CAP定理中的P总是成立的。
[refer](http://www.ruanyifeng.com/blog/2018/07/cap.html)
五、事务的隔离级别
[refer](https://www.cnblogs.com/huanongying/p/7021555.html)
六、JWT
Json Web Token:
目前比较流行的跨域身份认证的解决方案。
服务器验证后将生成一个json对象,添加了签名,并将其返回用户,以后用户与服务器通信在请求中发回json对象。
这个json对象是一个很长的字符串,点分隔为3 个字串,header头,payload有限负荷和signature签名。
头描述JWT元数据默认使用sha256加密算法转为字符串保存;有限负荷是JWT主体部分,包含需要传递的数据,采用base64加密算法;签名哈希是对上两部分数据签名,指定算法加密确保数据不被篡改。
一般将JWT放在请求头authorization字段中。
[refer](http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html)
七、最长回文子串问题
def longestPalindrome(s): """动态规划解决最长回文子串问题""" n = len(s) maxl = 0 start = 0 for i in range(n): if i - maxl >= 1 and s[i - maxl - 1: i + 1] == s[i - maxl - 1: i + 1][::-1]: start = i - maxl - 1 maxl += 2 continue if i - maxl >= 0 and s[i - maxl: i + 1] == s[i - maxl: i + 1][::-1]: start = i - maxl maxl += 1 return s[start: start + maxl] chuan = longestPalindrome("ascdadcbderedbcty") print(chuan)
[refer](https://blog.csdn.net/asd136912/article/details/78987624)
八、两壶倒水问题
问题:两个空水壶分别为5升和6升,在一个无穷尽水塘里取水,怎样可以取到3升的水。
九、大中小马驮石问题
问题:大中小三种马100匹,驮100个石头,大马一次驮3个石头,中马一次驮2个石头,2匹小马一次驮一个石头,大中小马各多少匹,有多少种组合?
思路:穷举或方程式计算算法
十、楼梯钻石问题
问题:1~10楼每层电梯门口放个钻石,大小不一,从1楼坐到10楼,每层电梯都会打开一次,怎样拿到最大一颗钻石?
思路:这个问题类似《算法导论》第五章 概率分析和随机算法 5.1雇佣问题,65页
这里抽象化每个楼层和钻石为一个list: