Algorithm
【字符串解码】压缩算法
类似字符串解码394. 字符串解码 只不过解码方式不同。
【单调栈】逛街
Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)
- 首先向左看,使用单调递减栈从左往右入栈,当nums[i]入栈时,res[i+1]+=stk.size();
- 然后向右看,使用单调递减栈,从右往左入栈,当num[i]入栈时,res[i-1]+=stk.size();
逆序对作为程序员的小Q,他的数列和其他人的不太一样,他有2^n个数。 老板问了小Q一共 m次,每次给出一个整数q_i(1<=i<=m), 要求小Q把这些数每2^{q_i}分为一组,然后把每组进行翻转,小Q想知道每次操作后整个序列中的逆序对个数是多少呢?
使用归并排序计算逆序对时,知道整个数组的逆序对的数量为归并排序过程中每一层的逆序对数量之和。
而对于该题,需要统计每层分别有多少个逆序对,以及每一层有多少个顺序对(翻转后求逆序对)。
然后进行翻转的时候,例如q=3,则最后三层的逆序对数量都会变成其顺序对数量,这时候整个数组的逆序对数量就是:前三层顺序对数量+后面层的逆序对数量
【动态规划,状态转移方程组】假期 由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。
dp[i][0],dp[i][1],dp[i][2]
分别表示第i天休息|工作|锻炼 ,前i天至少需要休息几天
base case : dp[0][i]
= 0
//1. 选择休息,故天数多1
dp[i][0] = min(dp[i-1][0], min(dp[i-1][1], dp[i-1][2])) + 1;
//2. 不休息,选择工作
dp[i][1] = min(dp[i-1][0], dp[i-1][2]);
//3. 不休息,选择锻炼
dp[i][2] = min(dp[i-1][0], dp[i-1][1]);
//边界:第0天休息天数为0
dp[0][i] = 0 (i = 1, 2, 3)
603. 连续空余座位
select distinct a.seat_id from cinema as a , cinema as b where abs(a.seat_id-b.seat_id)=1 and a.free=1 and b.free=1 order by a.seat_id;
586. 订单最多的客户
select customer_number from orders group by customer_number order by count(*) desc limit 1
1083. 销售分析 II
select t.buyer_id from (select buyer_id, sum(case when product_name ='S8' then 1 else 0 end) as s8_num, sum(case when product_name ='iPhone' then 1 else 0 end )as ip_num from Sales, Product where Sales.product_id=Product.product_id group by buyer_id) as t where t.s8_num>0 and t.ip_num=0;
1211. 查询结果的质量和占比
select query_name, round(avg(rating/position),2) as quality , round(sum(case when rating <3 then 1 else 0 end)/sum(case when rating >0 then 1 else 0 end)*100,2) as poor_query_percentage from Queries group by query_name;
1082. 销售分析 I
select seller_id from (select seller_id , rank() over(order by sum(price) desc) as r from Sales group by seller_id) as t where r=1;
Review
Linux 文件系统(一)—虚拟文件系统VFS----超级块、inode、dentry、file
C++ 实现一个简易的内存池
- 每个内存对象大小固定
- 使用链表来维护空闲节点,线程池维护一个head指针
- 使用链表的头插法实现将空闲节点插入到head实现free
- 重载使用线程池类的
void * operator new(size_t)
和void free(void*p)
函数
Tips
- c++ 引用也能实现多态。
- 把自己事情做好最重要
- 三思而后行,很多话说了、很多事情做了根本没到点子上,还浪费不少时间
- 还是要保持刷题的习惯,不管为了提升自己的能力还是为了找工作都是必要的,也是最费时间的地方。
- 我们的程序的执行过程需要白盒才行,当黑盒去做即使做了很多也很难有质的提升