Algorithm
复习题:
- 99. 恢复二叉搜索树:使用o(1)空间复杂度算法,先用lvr算法找到左边异常点:如果当前节点值小于上一个节点值,则上一个节点是异常节点。再用rvl算法找到右边节点,如果当前节点值大于上一个节点值,则说明上一个节点是异常节点。这个最好还是举个例子画画,不然容易错。
- 560. 和为K的子数组 preSum[i] = preSum[i-1]+nums[i-1],表示前i个数的和。然后枚举所有的k=sum[i…j]=preSum[j+1]-preSum[i].但这个枚举i,j的过程是N次方复杂度,会超时。我们在遍历j时,只需要知道有多少个preSum[i]=preSum[j+1]-K.因此在计算preSum数组时,可以统计前面出现过的所有的preSum的次数,通过hash表直接拿到这个次数,用这个次数加上去就好。
新题
- 460. LFU 缓存 这道题比较硬核,专门写了一篇博客介绍解法思路
- 241. 为运算表达式设计优先级 分治法,根据运算符号将字符串分为两个部分,然后分别递归去做,递归终止条件是没有运算符了,直接将字符串转化为数字返回
Review
DTO, DAO and MVC Concept
DTO: Data Transfer Object,是用来在类以及模块之间的传输对象,一般只包含私有变量以及gettter、setter、constructor,一般不包含业务逻辑
DAO:Data Access Object,是用来封装数据库CRUD逻辑的类
以下代码是DAO和DTO区别的例子
interface PersonDTO {
String getName();
void setName(String name);
//.....
}
interface PersonDAO {
PersonDTO findById(long id);
void save(PersonDTO person);
//.....
}
DTO和DAO都是MVC中的model部分,MVC是将整个应用划分为Model、View、Controller三部分。
Concurrency in Java 8— Oversimplified
关于java8 的并发编程极简入门教程,感觉比较实用,翻译了一下翻译文章
Tips
- 利用
n&(n-1)
可以消除二进制表示的最右边一个1,利用n&(-n)
可以拿到二进制表示的最右边一个1 - cache伪共享是指多个线程修改独立的变量时,这些变量共享同一个cache line,系统保证cache一致性会将整个cache line锁定,导致出现资源竞争。解决的办法就是给变量添加padding,对齐cache line大小(64字节),从而让这些变量处于不同cache line https://www.cnblogs.com/cyfonly/p/5800758.html
- CAS(CompareAndSwap)存在ABA问题,即cpu1将值从A改到B再从B改到A,CPU2进行CAS操作时,由于运来的值还是A,因此会成功,这样会覆盖掉cpu1的修改。解决的办法就是给值加上版本号。
- c++ set遍历时,会按照从小到大的顺序排序。
- c++ list (双链表)需要记住的用法:push_back、pop_back、push_front、pop_front、insert(iterator, value)、erase(iterator)。首元素 front,尾元素 back
- linux-shell 位置参数可以用
shift
命令左移。比如shift 3
表示原来的$4
现在变成$1
,原来的$5
现在变成$2
等等,原来的$1
、$2
、$3
丢弃,$0
不移动。不带参数的shift
命令相当于shift 1