c++ string
¶字符串和字符数组
¶cin.getline()与getline()的区别
cin.getline要使用字符数组做参数,getline要使用字符串做参数
cin.getline(字符数组,读取的长度);
getline(cin,字符串名)
12345678 char name[20]; string s;cin.getline(name,20); //OK getline(cin,name); //ERROR cin.getline(s,20); //ERROR getline(cin,s); //OK
¶string 与 stringstream
参考资料:
string和stringstream用法
C++ string类的用法整理
¶string基本用法
¶赋值
可以用 char* 类型的变量、常量,以及 char 类型的变量、常量对 string 对象进行赋值
123string s1;s1 = "hello";s2 = 'K';
¶拼接
我们一般常用+和+=运算符对 string ...
二分查找
¶二分查找算法概述
二分查找很简单吗?或许二分查找的思想是直观的,但是细节才是程序的核心。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的:
Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky…
¶二分代码的框架
12345678910111213141516int binarySearch(int[] nums,int target){ int left = 0; int right = ...; // 一般是数组的长度 while(...){ int mid = (left + right) / 2; //普通写法 //int mid = left + (right - left) / 2; // 防止溢出 if(nums[mid] == target){ . ...
前缀和与差分数组
¶前缀和算法
前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。
¶前缀和核心代码
1234567int nums[110],prefix[110];int n;cin>>n;for(int i=1;i<=100;i++){ cin>>nums[i]; prefix[i] = prefix[i-1] + nums[i];}
前缀和数组prefix[i] 就代表着 nums[0..i] 所有元素的累加和,如果我们想求区间 nums[i..j] 的累加和,只要计算 prefix[j] - prefix[i-1] 即可,而不需要遍历整个区间求和。
¶后缀和
后缀和和前缀和类似,只是建立数组的过程不太一样
123456for(int i=1;i<=n;i++){ cin>>nums[i];}for(int i=n;i>=1;i--){ sum[i] = sum[i+1] + nums[i];}
这里的sum数组sum[i]的含义就是 ...
使用Git实现hexo多端同步
¶前言
最近需要用两台电脑来更新博客,但是用U盘来回拷贝太麻烦而且有点捞,使用开始尝试使用git和github来实现hexo的多端同步
Hexo 本地和部署到Git page上的文件是不同的东西
在执行hexo g命令后,会在public目录下生成网页的静态文件,我们用hexo d上传的文件其实就是public目录下的这些静态文件。如果执行hexo clean,那么public文件夹就会消失。实现多端同步,只要让每台电脑上都有最新的资源文件就行了。
主要参考了以下文章:
利用Github实现hexo多端同步
Hexo在多台电脑上提交和更新
¶hexo同步原理
hexo博客目录结构说明
一般而言hexo的目录结构包含下面内容(shell脚本不属于hexo的目录结构)
文件夹
说明
是否需要上传github
node_modules
hexo需要的模块,就是一些基础的npm安装模块,比如一些美化插件,在执行npm install的时候会重新生成
不需要
themes
主题文件
需要
public
hexo g命令执行后生成的静态页面文件
不需要
packag ...
高精度算法
¶高精度问题
高精度主要是解决处理大整数时的问题,这里的整数范围要超过longlong。
高精度问题的核心就是使用字符串去模拟加法、减法、乘法、除法运算
¶高精度加法
¶基本
使用三个数组a[],b[],c[]存储
模拟加法竖式:累加 进位 留位
累加: c[i] += a[i] + b[i] ——>必须要累加之前的进位,使用 += //累加进位和对应位置的数字
进位:c[i+1] = c[i] / 10;
留位:c[i] %= 10;
Q1:假设正整数A的长度为n,正整数B的长度为m,那么A+B的长度最大为多少?最小为多少?
A1: 长度最大:max(n,m)+1 长度最小:max(n,m)
¶算法步骤
高精度数的读取与存储:使用字符串方式读取,然后将每一个字符转为整数,逆向存储到一个整型数组中
模拟加法操作:通过数组下标模拟两个加数中每一个为上数的加法(累加、进位、留位)
去除前导0,逆向重组(因为之前是逆向加,再反过来)
¶高精度加法函数
123456789101112131415161718192021222324252627282930 ...
01背包-目标和
¶题面
力扣题目链接-目标和
给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。
返回可以使最终数组和为目标数 S 的所有添加符号的方法数。
示例:
输入:nums: [1, 1, 1, 1, 1], S: 3
输出:5
解释:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
一共有5种方法让最终目标和为3。
提示:
数组非空,且长度不会超过 20 。
初始的数组的和不会超过 1000 。
保证返回的最终结果能被 32 位整数存下。
¶解析
记加负号的元素之和为neg,加正号的元素之和为pos
例如:
给出的数组是 [1,1,1,1,1]
目标的结果是 3
其中的一种组合方法为 +1+1+1 -1 --> pos = 3, neg = 1
$target = pos - ( neg )------①$
这里的关键在于把neg的负号提出来,所以:
$pos ...
动态规划算法
¶动态规划
¶总方法论 - 动态规划五部曲
确定DP数组(DP table)以及下标的含义
动态规划的核心在于理解和明确DP数组所表示的含义
在进行动态规划递推公式推导的时候要紧紧围绕着DP数组的含义
推导递推公式
推导递推公式的关键在于找到当前状态可以由哪些状态转移而来
要搞清楚可以从哪些状态转移来就要紧紧围绕着DP数组的含义
dp数组如何初始化
在确定递推公式之后在进行初始化
确定遍历顺序
举例推导dp数组
如果动规结果不正确,最好的方式是打印出来DP数组的值,分析与预期结果哪里不正确
¶动态规划:01背包理论基础
¶01背包问题基本题目(二维数组解法)
题目描述
有个背包可承受重量N,现有T件物品,每件物品重量为Wi,价值为Vi ,每件物品只有一个,这个背包可以装载物品的最大价值是多少?
输入格式
第一行,两个整数,分别表示N和T,用空格隔开(N≤1000,T≤100)
接下来T行,每行两个整数,分别表示T件物品的重量Wi和价值Vi(1≤Wi,Vi≤100)
输出格式
一行,表示这个背包可以装载物品的最大价值
输入输出样例
输入样例1:
100 5
...
C++のSTL
¶set容器
https://www.cnblogs.com/linuxAndMcu/p/10261014.html#_label2
¶字符串和字符数组
¶cin.getline()与getline()的区别
cin.getline要使用字符数组做参数,getline要使用字符串做参数
cin.getline(字符数组,读取的长度);
getline(cin,字符串名)
12345678 char name[20]; string s;cin.getline(name,20); //OK getline(cin,name); //ERROR cin.getline(s,20); //ERROR getline(cin,s); //OK
¶sort排序
sort主要是使用了快排并融合了堆排序等方法
¶基本用法(一维数组)
默认对传入的数据进行从小到大排序
12vector<int> a;sort(a.begin(),a.end());
可以使用cmp函数改变排序规则
使用cmp函数改为从大到小排序
123bool cmp( ...
信奥竞赛技巧
¶简介
¶STL容器
见 站内:cpp STL详解
¶算法
¶技巧
¶输入输出加速代码
1ios::sync_with_stdio(false); //输入输出加速
作用
取消同步:
默认情况下,C++ 的标准输入输出流(cin 和 cout)与 C 的标准输入输出流(stdin 和 stdout)是同步的。这意味着每次使用 cin 和 cout 时,都会确保两者的状态一致,这样会导致性能损失。
调用 ios::sync_with_stdio(false); 可以取消这种同步,使得 C++ 的输入输出流更快,因为不再需要每次都保持同步。
提高性能:
在处理大量输入输出时,取消同步后,使用 cin 和 cout 的性能会显著提高。这在竞争性编程或需要快速处理大量数据的场合中非常有用。
¶字符串读取空白、回车问题
方法1
123//使用下面代码可以让字符串s忽略掉换行、空白string s;getline(cin >> ws, s);
方法2
12345//使用下面代码可以让字符串s不读取掉换行//使用cin.get()吃掉换行string s;cin.get() ...
重装系统前后需要完成的事情
¶重装系统之前备份
在重装系统之前需要备份的重要文件
备份浏览器插件(以chrome为例)
插件安装本地地址:C:\Users\主机名\AppData\Local\Google\Chrome\User Data\Default\Extensions
这里会有一堆文件夹,其文件夹名对应的是插件的ID
点开Chrome-拓展程序-打包拓展程序-选择拓展程序根目录
这里需要打包的是点开上文文件夹打包里面的版本号文件夹
然后就会生成crx文件
备份桌面文件、C盘文档文件夹、图片文件夹、视频文件夹
截图备份:桌面图标位置、快速访问文件夹、开始菜单快捷方式
保存油猴脚本中的脚本(打包导出到本地)
参考装机软件恢复常用软件