前缀树
需求
高效存储和检索字符串数据集中的键
前缀搜索和拼写检查
数组实现插入Insert: O(1)->O(N)
搜索Search:O(N)
前缀搜索 startWith:O(NM)
TrieTire,又称前缀树或字典树,是一颗有根树,每个结点包含以下字段。
指向子节点的指针数组children,对于26字母而言,数组长度为26。此时children[0]对应a,children[1]对应b,……,children[25]对应z。
布尔字段isEnd,表示该结点是否为字符串的结尾
数据结构图
性能分析k为字符串长度
插入Insert: O(k)
搜索Search:O(k)
前缀搜索 startWith:O(k)
数据结构实现
插入字符串
我们从字典树的根开始,插入字符串。对于当前字符对应的子节点,有两种情况:
子节点存在。沿着指针移动到子节点,继续处理下一个字符。
子节点不存在。创建一个新的子节点,记录在 children 数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符
重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾 ...
Linux设置开机自启动
在rc.local文件中添加自启动命令
执行命令,编辑/etc/rc.local
vim /etc/rc.local
在文件最后一行添加要执行的命令
cd /home/ubuntu/projects/tinyHTTP && nohup sudo ./httpd &
添加完后设置rc.local可执行权限
chmod +x /etc/rc.local
VisualStudio调试
编译错误错误:'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
解决方案:
1.在写代码的前面加上如下宏定义
2.关闭SDL检查
SDL(Security Development Lifecycle)是指安全开发生命周期,是一个安全保证的过程。
动态调试
设置断点(鼠标左键点击代码左侧)
开始调试
F5可以运行到断点或者程序结束(没有断点)
F11单步进入到程序第一行代码
调试中
F5继续运行直到下一个断点
F11单步执行,遇到函数进入[没有调试源码的不进入]。
shift+F11进入函后的跳出指令,
F10单步跳过,遇到函数不进入。
查看调试变量
自动窗口:查看执行代码周围的变量(比如当前执行代码的上下三行内)
局部变量:当前作用域内的变量
监视:可以监视 ...
拓扑排序
207.课程表
[1,0]表示0->1
数据结构:
入度表 vector<int>
邻接表 map<int,vector<int>>
队列 queue<int> 存储入度为0的结点
class Solution {public: bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { /* 1->2 1->3 得到1->2,3 将1弹出时,2的入度和3的入度-- */ vector<int> inDegree(numCourses); map<int,vector<int>> map; for(int i=0; i<prerequisites.size(); i++) { ...
C++输出格式
对输出小数精度控制头文件:<iomanip>
注意:不加fixed,setprecisioin()会控制有效数字的位数,而不是小数点的位数
#include<iomanip>#include<iostream>using namespace std;int main(){ double pi=3.14159; cout<<setprecision(3)<<pi<<endl;//3.14 cout<<fixed<<setprecision(3)<<pi<<endl;//3.142 return 0;}
移动测试“
概念
功能测试:查看功能是否正常
安装卸载测试
升级测试
兼容性测试
Android系统版本
厂商二次开发版本
不同的分辨率
不同的网络
网络切换、中断测试使用中来电话、短信横竖屏切换健壮性:耗电量、流量消耗、崩满回复
环境搭建
java sdk
安装
配置JAVA_HOME和PATH
Android SDK
解压
配置ANDROID_HOME和PATH
安装虚拟机/真机的开发者模式
appium client(Python)
appium server
adb命令adb devices:测试连接是否成功
adb devices -l:查看deviceName
model后面就是设备名
adb shell: 进入安卓内核
adb shell getprop ro.build.version.release:获取安卓版本
adb shell dumpsys window | findstr mCurrentFocus 查看运行的apk和界面
/前是包名,/后是app当前的活动
appium连接真机
注意:
Remote Path必 ...
map排序
map对于key(键)的排序map中的key 默认排序#include<bits/stdc++.h>using namespace std;//对于map中的key的默认排序 map<int,string>m; int main(){ m[1]="iui"; m[87]="sjddd"; m[2]="jsd"; m[67]="yuuuu"; for(auto item: m) { cout<<item.first<<" "<<item.second<<endl; } return 0;}
key的自定义排序#include<bits/stdc++.h>using namespace std; struct rule{ bool operator()(const string& a,const string& b) const { ...
输入输出重定向
freopen() 定义在<stdio.h>头文件中,是 C 语言标准库中的函数,专门用于重定向输入流(包括 scanf()、gets() 等)和输出流(包括 printf()、puts() 等)。值得一提的是,该函数也可以对 C++ 中的 cin 和 cout 进行重定向。
#include <iostream> //cin、cout#include <string> //string#include <stdio.h> //freopenusing namespace std;int main() { string name, url; //将标准输入流重定向到 in.txt 文件 freopen("in.txt", "r", stdin); cin >> name >> url; //将标准输出重定向到 out.txt文件 freopen("out.txt", "w&q ...
随机数
生成随机数#include<iostream>#include<cstdlib>#include<ctime>using namespace std;int main(){ unsigned seed; seed=time(0);//返回1970年1月1日午夜开始到现在逝去的秒数 cout<<seed<<endl; srand(seed);//只需调用一次 cout<<rand()<<endl; return 0;}
限制随机数的范围#include<iostream>#include<cstdlib>#include<ctime>using namespace std;int main(){ unsigned seed; seed=time(0);//返回1970年1月1日午夜开始到现在逝去的秒数 cout<<seed<<endl; srand(seed);//只需调用一次 //生成范围为[min_val,max ...
字符串的分割
stringstream#include<bits/stdc++.h>using namespace std;int main(){ //1,2,3,4,5 //如何分割逗号间隔的字符串 string str; getline(cin,str); stringstream ss(str); string str_num; vector<int> vec; while(getline(ss,str_num,',')) { vec.push_back(stoi(str_num)); } for(int i=0; i<vec.size(); i++) { cout<<vec[i]<<" "; } return 0;}
find & substr#include<bits/stdc++.h>using namespace std;int main(){ //1,2,3,4,5 //如何分割逗号间隔的字符串 s ...