Day06:继续学小知识的第六天
Day06 面试收获的小小知识点
中序非递归遍历
定义一个栈来模拟递归操作
外循环判断终止条件为当前节点是否为null&&栈是否为null
内循环的终止条件是当前节点的是否为null,
内循环将该节点入栈,并更新当前节点,当前节点指向其左孩子root.left
内循环结束后,当前节点更新为栈顶元素,并输出它的val,最后将当前节点更新为其右孩子root.right
前序非递归遍历
定义一个栈来模拟递归操作,先将根节点入栈
开始循环,循环终止条件为栈是否为null
当前节点赋值为栈顶元素,栈顶元素出栈,输出它的val,判断其右孩子是否为null,不为null就入栈,判断其左孩子是否为null,不为null就入栈
后续非递归遍历
定义两个栈来实现,栈1先将根节点入栈
开始循环,循环终止条件为栈1是否为null
将栈1栈顶元素出栈赋值为当前节点,并入栈2
判断当前节点的左孩子是否为null,不为null,将其入栈1
判断当前节点的右孩子是否为null,不为null,将其入栈2
循环结束,输出栈2
查找字符串中只出现一次的字符的优化算法
下标法,即判断每一个字符第一次出现的位置和最后一次出现的位置是否相同,如果相同,就找到该字符。主要用到indexOf()和lastIndexOf()方法
public static String getFirstStr(String str){ for(int i=0;i<str.length();i++){ char letter=str.charAt(i); int start=str.indexOf(letter); int end=str.lastIndexOf(letter); if(start==end){ //说明该字符只出现一次 return String.valueOf(letter); }
HashMap优化法:https://zhuanlan.zhihu.com/p/289427286
判断质数的优化算
public boolean isPrime(int num) { int tmp =sqrt(num); for(int i= 2;i <=tmp; i++){ if(num %i== 0) return false; } return true; }
public boolean isPrime(int num) { //两个较小数另外处理 if(num ==2|| num==3 ) return false; //不在6的倍数两侧的一定不是质数 if(num %6!= 1&&num %6!= 5) return false; int tmp =sqrt( num); //在6的倍数两侧的也可能不是质数 for(int i= 5;i <=tmp; i+=6 ){ if(num %i== 0||num %(i+ 2)==0) return false; } return true; }
select for update是个什么锁?能够阻塞select语句吗?
是一种悲观锁、排他锁、写锁,其可以有效的防止高并发时候数据出错。select for update 会根据where后面的条件是否为索引/主键或者非索引字段,来选择进行行锁or表锁。
排他锁的申请前提
没有线程对该结果集中的任何行数据使用排他锁或共享锁,否则申请会阻塞。
for update仅适用于InnoDB,且必须在事务块(BEGIN/COMMIT)中才能生效。
不能阻塞select语句,因为select for update是一种写锁,select语句还在访问的时候是可以访问到的。
当我执行select status from t_goods where id=1 for update;后。我在另外的事务中若是再次执行select status from t_goods where id=1 for update;则第二个事务会一直等待第一个事务的提交,此时第二个查询处于阻塞的状态,可是若是我是在第二个事务中执行select status from t_goods where id=1;则能正常查询出数据,不会受第一个事务的影响。
Linux 命令中 如何在一个文件中查找特定字符串?
- vim xxx.txt 打开要查找的文件
- 使用 /abc [假定abc为要查询的字符串]
- 此时 光标 会在含有abc字符串的地方
- 使用 n 可以进行 下一个查找
Redis与MySQL 的区别
类型上:MySQL是关系型数据库,Redis是缓存数据库(非关系型数据库).
作用上:MySQL用于持久化的存储数据到硬盘,功能强大,但是速度较慢
Redis用于存储使用较为频繁的数据到缓存中,读取速度快.
存放位置:MySQL将数据存在磁盘上,Redis将数据放在内存中
查询上:redis只能用key去获取value,不支持sql语句来进行查询;而mysql则只能通过sql语句来进行查询,不能直接通过key来获取value。
使用场景:Redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快,一般会应用在下面一些场景:排行榜、计数器、消息队列推送、好友关注、粉丝;MySQL适合放一些重要数据, 关系性数据。
索引的种类
主键索引(PRIMARY KEY):它是一种特殊的唯一索引,不允许有空值,不允许重复。一般是在建表的时候指定了主键,就会创建主键索引, CREATE INDEX不能用来创建主键索引,使用 ALTER TABLE来代替。
唯一索引(UNIQUE KEY):与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
普通索引(INDEX):这是最基本的索引,它没有任何限制。
全文索引(FULLTEXT INDEX):FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引和仅适用于 CHAR, VARCHAR和 TEXT列。
组合索引:用多个列组合构成的索引,专门用于组合搜索,其效率大于索引合并。