刷题学习
持续更新中…
经典题型分类
链表、数组
经常使用:前后双指针、头尾双指针。
删除链表的节点
链表中倒数最后k个节点
链表中环的入口节点
二维数组,经常需要从右上角开始,而不是左上角。
二维数组中的查找
递归、回溯
自上而下分析、求解
经常使用:def function() + def functionCore() 的组合
矩阵中的路径
机器人的运动范围
正则表达式匹配
树的子结构
根据前序遍历和中序遍历,重建二叉树
二叉树镜像
迭代、动态规划
自上而下分析、自下而上求解
通常存储有用的中间结果
斐波那契数列、青蛙跳台阶、矩形覆盖
剪绳子
二叉树镜像
二分法
没有一成不变的模版,需灵活应对。
需设计的内容:
计算式:
int mid = left + ((right - left) >> 1);
区间处理:
下一区间包含mid,(边界值可能是最终结果)
下一区间不包含mid,(边界值不可能是最终结果)
while条件:
while (left < right)
while (left <= right)
其他特殊判断 ...
SpringBoot的杂货
Ctrl + J 生成代码模板
boolean flag = true
使用flag.if flag.else 可自动生成代码
fori 自动生成
flag.while 自动生成
new String().var 自动生成 其他类型同理
“Hello world”.sout 自动生成打印
.try 自动生成try catch
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); list.for list.fori list.forr 生成for循环
map.entrySet().iterator().var 拿到迭代器
iterator.hasNext().while 生成循环
选中后 + ctrl + alt + t 生成try catch等
隐藏侧边栏 alt + 1 隐藏debug/run底边栏 alt + 4
两次shift 查找
构建、运行java项目 参考链接
构建运行springBoot项目 参考链接
...
STL刷题工具
vector
可变长集合
根据源码,vector自身完全杜绝浅拷贝
初始化:
123456vector<T> v1; // 定义空vector,执行默认初始化vector<T> v2(v1); // 深拷贝vector<T> v2 = v1; // 深拷贝vector<T> v3(n, val); // 初始化,包含n个valvector<T> v4{a, b, c}; // 初始化vector<T> v5 = {a, b, c}; //同上
操作:
123456789101112131415161718192021222324252627vec.push_back(val);vec.pop_back();vec.empty();vec.size(); // 当前已有元素个数 vec.resize(n); // 改变队列长度vec.max_size(); //当前最大容量 vec.reserve(n); // 改变容量vec.clear();vec.front( ...
JMM(Java内存模型)不保证对64位long型和double型变量的写操作具有原子性
在计算机中,数据通过总线在处理器和内存之间传递。每次处理器和内存之间数据传递都是通过一系列步骤来完成,被称为“总线事务”。包括读事务和写事务。总线会同步这些事务,在一个处理器执行总线事务期间,总线会禁止其他处理器和I/O设备执行内存的读和写。
假设处理器A,B,C同时向总线发起总线事务,总线会进行公平仲裁。假设A获胜,此时A执行总线事务,B和C要等待其完成后再进行总线事务,若A在执行总线事务期间,处理器D也向总线发起了总线事务,此时处理器D的请求也会被总线禁止。
总线的工作机制类似串行化处理。在任意时间点最多只能有一个处理器可以访问内存。这个特性确保了单个总线事务之中的内存读写操作,具有原子性。
在32位机处理器上,如果要求对64位数据的写操作具有原子性,开销较大,为照顾这种处理器,Java鼓励但不强求JVM对64位的long型变量和double型变量的写操作具有原子性。当JVM在这种处理器上运行的时候,可能会把64位的long/double型变量的写操作,拆分为两个32位的写操作来执行。这两个写操作可能会被分配给不同的总线事务中执行,此时对这个64位变量的写操作将不具有原子性 ...
const整理_与_函数重载
const对象一旦创建其值不可改变,所以const对象必须初始化。
默认情况,const对象仅在本文件内有效。不同文件中出现同名const变量,等同于不同文件分别定义的变量。使用extern关键字可以在不同文件共享const变量。
12345// file_1.cc定义并初始化一个常量,该常量能被其他文件访问extern const int bufSize = fcn();// file_1.h头文件extern const int bufSize; // 与file_1.cc中定义的bufSize是同一个
const的引用(常量引用、指向常量的引用)
12345678910111213141516171819202122232425262728const int ci = 1024;const int &r1 = ci; // 正确,引用及其对应的对象都是常量r1 = 42; // 错误,r1是const的引用,其对应对象也是constint &r2 = ci; // 错误,不允许一个非常量引用指向一个常量对象int i = 42;const int & ...
迭代器整理
如果容器为空,begin、end均返回尾后迭代器。
迭代器操作:
*iter:返回所指元素引用
iter->mm:解引用iter并获取该元素名为mem的成员。等价于(*iter).mem
++iter、–iter
iter1 == iter2、iter1 != iter2
若容器对象为const常量,则只能使用const_iterator,只读不可写;否则既可使用const_iterator也可使用iterator。
cbegin()、cend()返回常量迭代器。
迭代器失效:(增删元素可能会导致迭代器失效,修改元素不会)
vector
push_back(val)触发扩容,所有迭代器失效。
insert(val)触发扩容,所有迭代器失效;insert(val)导致后面元素移动,后面被移动部分迭代器失效,前面不失效。
erase(val)导致后面元素移动,后面被移动部分迭代器失效,前面不失效。
deque
插删元素导致迭代器失效的情况较复杂,避免deque增删容器后仍使用原迭代器。详细内容参考其他大佬的博客。
list
因存储空间不连续,使 ...
类与结构体
结构体与class
class与struct的唯一区别就是默认的访问权限不同。struct默认访问权限是public;class默认访问权限是private。
12345678910111213141516171819// Sales_data.h#ifndef SALES_DATA_H#define SALES_DATA_H // 为避免命名冲突,一般预处理变量全部大写#include <string> // 预处理器看到 #include 标记时会将指定的头文件内容拷贝进来代替 #includeusing namespace std;struct Sales_data { string bookNo; // 未提供类内初始值,创建对象时,默认初始化为空字符串 unsigned units_sold = 0; // 可提供类内初始值,用于创建对象时初始化 double revenue = 0.0;}; // 分号结尾#endif// main.cpp#include "Sales_data.h"int main() { ...
Redis
数据结构与对象
1、简单动态字符串(SDS simple dynamic string)
2、链表
3、字典(map)
4、跳表
5、整数集合
6、压缩列表
对象
Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象、有序集合对象这五种类型的对象,每种对象都用到了至少一种前面介绍的数据结构。
Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)。
因为字符串键的值为字符串对象,所以用于字符串键的所有命令都是针对字符串对象来构建的。
Redis数据库中的键值对来说,键总是一个字符串对象,值则可以是**字符串对象(REDIS_STRING),列表对象(REDIS_LIST),哈希对象(REDIS_HASH),集合对象(REDIS_SET)或有序集合对象(REDIS_ZSET)**中的其中一种。
字符串命令的实现
1、SET
2、GET
列表对象
1 ...
Mysql排序和分页及存在的坑
mysql在做limit分页的时候,前面要提供order by进行排序规则的指定,否则mysql不知道该按什么规则进行数据排序,进而会出现数据混乱,分页结果混乱。
参考链接
order by null 的最用是强制不进行排序
参考链接
limit分页在前面指定order by进行排序,若order by的字段存在重复值,则对应的“重复”数据将导致数据混乱,导致分页结果混乱,可能会不同页出现相同的数据。
解决方案:order by的所有字段保证数据唯一性。可在目标字段后另加主键字段,保证排序的唯一性。
参考链接1
参考链接2
参考链接3
模板与泛型
将蓝图转换为特定的类或函数,转换发生在编译时期。
当编译器遇到一个模板定义时,它并不生成代码。只有当实例化出模板的一个特定版本时,编译器才会生成代码。
函数模板
123456789101112131415template<typename T> // 也可用 class T,但 typename T更直观int compare(const T &v1, const T &v2) { if (v1 < v2) return -1; if (v2 < v1) return 1; return 0;}int main(){ int res_1 = compare(1, 0); // 模板实例,编译器自动推断模板参数类型 vector<int> vec1{ 1,2,3 }, vec2{ 4,5,6 }; int res_2 = compare(vec1, vec2); // 模板实例,编译器自动推断模板参数类型 return 0;} ...