1.青蛙叫
class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
if(croakOfFrogs.size()%5!=0)return -1;
vector<int>counts(5,0);
unordered_map<char,int>hash={{'c',0},{'r',1},{'o',2},{'a',3},{'k',4}};
int res=0;
int curr=0;
for(int i=0;i<croakOfFrogs.size();i++){
if(croakOfFrogsi=='c'){
counts0++;
curr++;
res=max(res,curr);
}else{
int k=hashcroakOfFrogs\[i];
if(countsk-1==0)return -1;
countsk-1--;
countsk++;
if(k==4){
curr--;
countsk--;
}
}
}
if(counts0>0||counts1||counts2||counts3)return -1;
return res;
}
};
总结:这里的hash的初始化方法不是用:,学到了,另外得判断最后的这个。
2.最长回文串
class Solution {
public:
string longestPalindrome(string s) {
int low=0,high=0,max_len=0;
int n=s.size();
vector<vector<bool>>dp(n,vector<bool>(n));
for(int i=n-1;i>=0;i--){
for(int j=i;j<n;j++){
if(si==sj&&(j-i<=1||dpi+1j-1)){
dpij=true;
if(j-i>max_len){
max_len=j-i;
low=i;
high=j;
}
}
}
}
string res;
for(int i=low;i<=high;i++)res+=si;
return res;
}
};
总结:这里可以不使用dp,可以对每个位置当成中间点,去判断奇数回文串、偶数回文串是不是可以
八股总结:
1.B+树和红黑树的区别是什么,为什么mysql索引不使用红黑树?
红黑树是二叉平衡搜索树,B+树是多路平衡搜索树,b+树相比红黑树可以减少磁盘io次数,便于范围查找,顺序查询。
2.为什么b+树的叶子节点有双向链表,非叶子节点有吗?
b+树的叶子节点存储数据,或者指针,按照key有序排列,使用双向链表便于按照两个方向的顺序查找,便于范围查找,非叶子节点是用于向下索引叶子节点,没有横向查找的场景,不需要双向链表。
3.事务的四个特性是什么,都是怎么保证的?
事务的四个特性是原子性、一致性、隔离性、持久性,原子性是通过undolog实现的,存储旧值或者反向操作,隔离性 通过mvcc,临键锁等实现,mvcc保证了快照读,临键锁是为了当前读,持久性是通过redolog实现的是预写日志,是可以用来掉电恢复。
一致性是通过aid,通过数据库约束和业务逻辑实现的。
4.关于死锁的四个条件和解决方法
四个条件分别是互斥、请求和保持、不剥夺、循环等待,解决方法有死锁预防,破坏四个条件之一比如固定顺序申请资源、一次申请资源,破坏请求和保持,死锁避免可以通过银行家算法,死锁检测和恢复可以使用资源分配图检测,然后终止进程回收资源,回滚事务,除此之外也可以用鸵鸟策略忽略死锁。
5.静态库和动态库的区别
静态库和动态库的区别主要是链接时机和共享方式不同,静态库在链接时被复制到可执行文件,可能在多个程序重复包含,文件更大,更新需要重新编译,动态库在链接时只记录依赖,在运行时加载动态库,多个程序可以共享,可能出现动态库缺失或者版本不兼容的问题。
6.static
static的作用,static作用于局部变量会使得变量具有静态存储期,只初始化一次,程序退出时消亡,作用域不变,作用于全局变量会改变变量链接属性,变成文件私有;static作用于类的成员会使得和类绑定,多个对象共享同一份,作用于成员函数会使得不和对象绑定,没有this指针,只能访问类的static成员
7.多态的种类和实现原理
我复述一遍:多态分成静态多态和动态多态,静态多态发生在编译期,通过函数重载、运算符重载、模板实现,具体通过类型和模板实例化类型去决定调用哪个,动态多态通过虚函数实现,父类虚函数子类重写,在使用基类的指针或者引用调用子类的方法时,去决定具体执行。通过虚函数表和虚函数表指针实现,虚函数表存储指向虚函数的指针,虚函数表是含有虚函数的类有一个,然后每个对象会有一个虚函数表指针,通过虚函数表指针找到虚函数表,找到虚函数执行