2月17日 干货满满
剑指 Offer 47. 礼物的最大价值
数组移动 毫无疑问 经典的dfs题目
暴力dfs超时了 改用记忆化搜索 但是这题和标准的记忆化搜索有点不一样,因为当前格子拿到的值只能说是从此格开始往终点走的最佳路径而不是从起点开始的最佳路径
所以逆向记录 memo[x][y] = val - cur (终点答案-当前值)
剑指 Offer 49. 丑数
题目有点绕 说丑数时只包含2、3、5的质子,也就是说可以包含其他数,但是质子只能为2、3、5
一般算因子题目都是倍数 本题类似
但是需要取到第n个最小的丑数 所以使用优先队列 每次取出队首元素,然后队首元素的2x,3x,5x倍同为丑数加入
剑指 Offer 50. 第一个只出现一次的字符 干货来了
题目本身不难 我是用哈希表计数,然后范了一个错误 因为我想去除哈希表中次数>1的数字 于是出现p4的情况 代码片段贴在p5
并发修改异常 我在我的blog哈希表那一篇中说过HashMap是线程不安全的,在多线程下修改和取值会报错原因是
如 int i = map.get(a);
取值操作在经过jvm编译之后生成的字节码文件中其实会分为4步
1、计算桶下标
2、取出a的值
3、生成int i对象
4、将a的值赋值给i
如果此时线程2在给a赋值 但是线程1还没有做完上述4步就会出现问题
我又查看了源码发现If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation), the results of the iteration are undefined.
即使在单线程下面也会报错。应该是编译不通过而不是迭代操作会新开辟一个线程
欢迎大佬来讨论一下