C/C++
自我学习的理解,代码,以及资料,完整的代码将会在我上传的资源里面
郑师傅炒板栗
老师不是说你啊
展开
-
CJSON库的学习
CJSON与JSON原创 2022-08-11 12:35:05 · 637 阅读 · 0 评论 -
字符串指针变量和字符数组的区别
字符串指针变量和字符数组的区别原创 2022-04-13 13:10:36 · 235 阅读 · 2 评论 -
dia和威严(dfs)
(1)代码 + 思路(注释)// 边 权值 树 DFS// 边权,点权 // 因为只会往下,所以不开标记数组(不会回溯) #include <bits/stdc++.h>using namespace std;const int N = 200010;#define ll long long vector<pair<int, int>> resu[N]; // 存储上级x到下级y传递信息的时间kint n; // 学生会的总人数,包括会长dia(ro.原创 2022-04-12 18:49:51 · 455 阅读 · 0 评论 -
常用的递归算法:dfs(深度优先搜索),记忆化搜索,分治
递归值函数调用自身;一、DFS的介绍概念很简单,但是还是得了解一下,下面介绍的内容是重点1. 图的DFS(1)先看一下vector是怎么建图的?vector<int> vecMap[100010];// n条边(这个结点所连接的结点) 邻接表建图for (int i = 0; i < n; ++i) { int x, y; vecMap[x].push_back(y); vecMap[y].push_back(x); //若是无向图就加上这一句}(2.原创 2022-04-12 14:54:52 · 1430 阅读 · 0 评论 -
ranko的手表(枚举)
(1)思路:枚举所有t1,t2可能的分钟数(转换成分钟好算),再遍历这些枚举的可能结果,不断维护更新最大时间间距和最小时间间距,主要就是这个过程该如何枚举:见代码有注释(时有十位和个位,分有十位和个位)(2)测试数据18:0?2?:1?(3)代码:// 贪心可以,但是考虑的情况很多且复杂 // 24 *60 枚举可以过// 将时分统一转换为分钟,到时候好算// 枚举t1和t2可能的分钟数,合理的先加入到vector容器中 #include <bits/stdc++.h&.原创 2022-04-10 17:05:14 · 1025 阅读 · 0 评论 -
数位染色(状压枚举/dfs)
(1)思路:x的范围不超过1e18,所以x最多只有19位数字。O(n2^n)状压枚举每位选或不选即可通过。(每个位置上两种状态0或1,多少位置,2的多少次方)还需要遍历n;代码中有注释,可以先看一遍代码,方便理解(2)测试数据1234567(3)代码(状压—状态压缩)// 状压基本模板 #include <bits/stdc++.h>using namespace std;#define ll long long int zt[22]; //代表每一位上的数字,等下..原创 2022-04-10 15:33:48 · 719 阅读 · 0 评论 -
you和帆船(枚举)
(1)测试数据21 00 1(2)代码(思路在注释中)// 直接枚举 //2 ≤n ≤2000 可以枚举 #include <bits/stdc++.h>using namespace std;int n;const int N = 2005;int a[N][2]; double minDis = 1e9; //最小路径和 int main () { double tmp; cin >> n; // 输入宝藏的地点 for (int i =.原创 2022-04-10 14:31:36 · 195 阅读 · 0 评论 -
chika和蜜柑(贪心/优先队列)
chika和蜜柑(1)思路:贪心按照甜度最大的来取(从大到小排序),遇到相同甜度的去酸度最小(从小到大排序),可以用sort也可以用优先队列来写;(2)测试数据3 21 3 42 2 5(3)代码(贪心思想 + sort)#include <bits/stdc++.h>using namespace std;#define ll long longint n;// 在C++的语法里面,可以直接用 结构体名字来定义变量,而无需用typedef重命名 struct原创 2022-04-09 21:55:04 · 520 阅读 · 0 评论 -
疯狂的自我检索者(贪心)
疯狂的自我检索者(1)关键思路贪心的思想:未知的人都打5分,就是最大的了,未知的人都打1分,就是最小的了;(2)测试数据5 11 2 3 4(3)代码// 贪心 #include <bits/stdc++.h>using namespace std;#define ll long long ll n, m;double avMax;double avMin;int main () { ll x; cin >> n >> m;原创 2022-04-09 20:48:01 · 419 阅读 · 0 评论 -
贪心算法的介绍+枚举算法的介绍(brute force):包含练手题目
一、什么是贪心算法贪心值每一步都做出当前最优的选择。一般解决的问题有如下特点:局部最优能导致全局最优。1. 举个例子:问题如下:纸币面额有1元、2元、10元、100元。问凑出正好x元最少要多少张纸币?关键思路:我们就可以用贪心,每一次都尽量取面额大的,不断凑出x;为什么这样贪心不会有问题?因为 1 2 10 100, 这些数字之间,他们有整除关系,这意味着,多张小面额的纸币,一定可以被面额大的数字所代替;如果现在的纸币面额为1 15 17 21,那么还可以用贪心吗?思考一下;现在已原创 2022-04-09 19:56:57 · 537 阅读 · 0 评论 -
kotori和n皇后
kotori和n皇后(1)测试数据51 22 53 16 74 8224(2)关键思路开4个set,分别存x、y、x + y、x - y;遍历时,不断查询每个点是否在某个set里面存在,若不存在则分别加入4个set。否则证明和之前的皇后会攻击(把这个i皇后保留下来);现在来说一下,为什么要保留这四个;x, or y集合中如果有已经相等的,说明是在同一行或者同一列(同行和同列会互相攻击);x - y存进集合中如果有已经相等的,说明在同45斜角(x1 - y1 == x2原创 2022-04-08 22:38:45 · 365 阅读 · 0 评论 -
算术教室(两种方法,一种set,一种利用二分)
算术教室关键思路:方法一:将a数组排好序后,然后遍历b数组,利用二分查找的方法(logn),在a数组中查找x-b[i];(这个方法先略过,以后有时间补上,这里主要是熟悉STL操作);方法二:利用set集合,将a数组输入到set集合中,然后在集合中查找x - b[i](1)测试数据5 4 121 3 4 5 93 4 6 10(2)代码(set)#include <bits/stdc++.h>using namespace std;#define ll long l原创 2022-04-08 20:56:42 · 514 阅读 · 0 评论 -
计划清单(模拟)
思路:双端队列+结构体模拟#include <bits/stdc++.h>using namespace std;struct Task { string name; long long lel;};deque<Task> dq;// 双端队列long long n;int main() { cin >> n; for (int i = 0; i < n; ++i) { Task tmp; cin >> tmp....原创 2022-04-08 19:16:03 · 155 阅读 · 0 评论 -
小红练心算
思路:把握三个数字,构造一个函数,返回值是下一个平方的数字(m),然后更新a(k:全局变量)与a+2*x(t:全局变量,!!!但是但是,为了最后的输出方便,t就接收较大的值,也就是说t可等于更新后的a,例如:48 ,k = 46,,t = 50,看代码吧,这里说的不好),这里我们用括号里面的数字简略代替,什么意思呢?我们用939来举例经过一次函数调用之后,k = 900,t = 978,m = 39(待平方的数字);所有的乘积小的数一定写在大的数前面这题用long long,数据挺大的;可以算...原创 2022-04-08 17:03:09 · 158 阅读 · 0 评论 -
小红和R (模拟)
思路:找规律第一行,输出n+2个R;接下来n行,先输出一个R,然后输出n个空格,接着再输出一个R来结尾;接下来,输出n+2个R;接下来的n+1行,每行都是输出两个R,注意,两个R之间有空格,空格的个数从0开始递增,知道最后一行有时候这样的题,单个看,不好看,就得一块一块的分区看,来找规律;#include <bits/stdc++.h>using namespace std;int n;int main() { cin >> n; for (int i ...原创 2022-04-08 14:09:22 · 112 阅读 · 0 评论 -
小红填符号
小红填符号思路:模拟(16个if),这是暴力的方法#include <bits/stdc++.h>using namespace std;double a, b, c, x; // !!!// 注意要特判除0的情况 int main (){ cin >> a >> b >> c >> x; if (a + b + c == x) cout << "+ +" << endl; else if (原创 2022-04-08 13:49:38 · 108 阅读 · 0 评论 -
小红划数字
小红划数字关键思路:这个数的个位数字是偶数,那它就是偶数;所以我们可以优先划掉后面的数字,直到遇到偶数为止;不要想的太复杂了;#include <bits/stdc++.h>using namespace std;string nums;int main() { cin >> nums; bool flag = false; int lenN = nums.size(); int ans = 0; for (int i = lenN - 1; i原创 2022-04-07 21:57:08 · 187 阅读 · 0 评论 -
STL 相关知识点粗略浅过一下(包括迭代器)
一、vector(1)代码// vector// vector 大多数情况下可以代替普通数组(vector 可变长度)#include <bits/stdc++.h>using namespace std;//模拟图的邻接表int main () { vector<int> a[10010]; //建议vector数组开大点 int n, m; // n 个结点,m条边 cin >> n >>m; for (int i = 0; i原创 2022-04-07 17:37:45 · 345 阅读 · 0 评论 -
void 类型指针、const和指针、指针和数组,二级指针
一、void 类型指针- void解释为“空虚,空隙”,而在C++语言中,void被翻译为“无类型”,相应的void*为“无类型指针”。- void* 指针变量可以指向任意变量的内存空间,任何类型指针变量都可以转为void *。 - int num = 10;- void* p = #- int* p_num = #- void* p1 = p_num; (也是可以这样写的)- 一般在函数里面用到void* | memset()- 对应void*指针变量,不要原创 2022-04-07 12:14:38 · 1165 阅读 · 0 评论 -
1.9静态库和动态库的对比
一、程序编译成可执行程序的过程二、静态库制作过程三、动态库制作过程四、什么时候使用静态库,什么时候使用动态库?一般情况下,如果库挺小的,就使用静态库;如果库大的话,建议使用动态库;理解二者的优缺点后,就可以明白了五、静态库的优缺点:(代码运行的时候要加载到内存中)优点:静态库被打包到应用程序中加载速度快;(程序一运行就加载到内存中)发布程序无需提供静态库,移植方便;缺点:消耗系统资源,浪费内存;更新,部署,发布麻烦;(程序要重新编译)六、动态库的优缺点原创 2022-04-06 20:47:22 · 330 阅读 · 0 评论 -
指针的一个灵活测试代码(获取第二、三字节的数据)涉及到指针的跨度和宽度概念
指针的一个灵活测试代码(获取第二、三字节的数据)涉及到指针的跨度和宽度概念// 获取第二个和第三个字节的数据(涉及到指针的宽度和跨度) #include <bits/stdc++.h>using namespace std;int main () { int num = 0x01020304; int* p =# char* c = (char*)# // int是4字节的,char 是1字节的,强转之后,只会取到最低那一个字节的 short*原创 2022-04-06 16:33:45 · 455 阅读 · 0 评论 -
1.6动态库的制作
一、动态库的命名规则1. Linux:libxxx.solib:前缀(固定)xxx:库的名字,自己起.so:后缀(固定)在Linux下是一个可执行文件2. Windows:libxxx.dll原创 2022-04-05 22:00:23 · 2677 阅读 · 0 评论 -
CD1 在行列都排好序的矩阵中找指定的数
CD1 在行列都排好序的矩阵中找指定的数关键思路:简单模拟,即时比较#include <bits/stdc++.h>using namespace std;const int N = 1e4 + 10;int n, m, k;int mrx[N][N];bool flag = false;int main () { scanf("%d%d%d", &n, &m, &k); for (int i = 0; i < n; ++i原创 2022-04-05 14:18:37 · 156 阅读 · 0 评论 -
AB5 点击消除
AB5 点击消除关键思路:如何消除 + 栈// 结合AB 3的有效括号序列,消除的思想#include <bits/stdc++.h>using namespace std;// 辅助栈stack<char> stk;string str;int main() { cin >> str; int lenStr = str.size(); stk.push(str[0]); // 先把第一个字符压入栈中原创 2022-04-04 23:40:15 · 371 阅读 · 0 评论 -
AB4 逆波兰表达式求值
AB4 逆波兰表达式求值关键思路:栈,遇到数字压入栈中,遇到运算符,就弹出栈顶两个元素计算,计算后再压入栈中先判断的是否是运算符,遇到好多坑点,注意一下;还有就是,这里有负数,所以我们用stoi这个函数来转换成数字,减少一部分麻烦;class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param tokens string字符串vector原创 2022-04-04 23:10:25 · 233 阅读 · 0 评论 -
AB3 有效括号序列
AB3 有效括号序列关键思路:辅助栈,匹配则消掉;代码中详细解释class Solution {public: /** * * @param s string字符串 * @return bool布尔型 */ bool isValid(string s) { // write code here // 辅助栈 stack<char> stk; // 用来存储“左” ( { [原创 2022-04-04 21:53:59 · 389 阅读 · 0 评论 -
AB2 栈的压入、弹出序列
AB2 栈的压入、弹出序列关键思路:辅助栈模拟,具体思路模拟在代码中;class Solution {public: // 解题思路:利用一个辅助栈来模拟 // 1. 栈是先入后出结构 // 2. 本题判断这个弹出序列是否可行,那么要想能弹出就得先入栈 // 3. 那么我们就用两个指针分别指向这两个序列,i指针指向pushV,j指针指向popV // - 首先若当前两个指针指向的元素相等,说明这个元素是放入栈后立马弹出的,就得++i, ++j一起移原创 2022-04-04 19:18:47 · 216 阅读 · 0 评论 -
AB7 【模板】队列
AB7 【模板】队列hh : 队头(初始化0),tt : 队尾(初始化 -1);一旦hh > tt 即代表队列为空#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int que[N];int hh; //队头0int tt = -1; //队尾-1// 当 hh > tt时,即队列为空string op; //操作的名称// 队列是先进先出的,从队尾进入,从队头出去vo原创 2022-04-04 15:12:15 · 228 阅读 · 0 评论 -
AB1 【模板】栈
AB1 【模板】栈tt == 0 代表栈是空的(判断栈空方便),tt 为指向栈顶的“指针”;push x, 往栈顶插入x;pop 栈不空就可以弹出,弹出的时候,还要输出该数;top 栈不空就可以获得栈顶元素,记得输出该数;#include <bits/stdc++.h>using namespace std;// 模拟栈,0就代表栈空const int N = 1e6 + 10;int stk[N];int tt;void pushOP(int k) { st原创 2022-04-04 14:16:54 · 225 阅读 · 0 评论 -
1.4 静态库的制作
一、什么是库库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库(二进制),它提供给使用者一些可以直接拿来用的变量、函数或类;库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。(因为要提供给别人使用)库文件有两种,静态库和动态库(共享库),二者的区别是:静态库在程序的链接阶段被复制到了程序中;(根据GCC编译的原理,预处理—编译—汇编—链接(链接成可执行程序);其实静态库和动态库都是在链接阶段做的处理)动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动原创 2022-04-04 00:07:06 · 1154 阅读 · 0 评论 -
NC101 压缩字符串(一) 牛客题霸
双指针模拟class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param param string字符串 * @return string字符串 */ string compressString(string param) { // write code here // 双指针 i原创 2022-03-27 21:32:22 · 432 阅读 · 0 评论 -
NC38 螺旋矩阵 牛客题霸
模拟题,注意越界啊!class Solution { public: vector<int> spiralOrder(vector<vector<int> >& matrix) { // 简单模拟 int m = matrix.size(); // 行 vector<int> C; if (m == 0) return C; .原创 2022-03-27 20:06:40 · 425 阅读 · 0 评论 -
NC1 大数加法 牛客题霸
关于高精度大数的计算,我之前写过一篇笔记(ACWING 大神的思想模板),可以参考一下高精度class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 计算两个数之和 * @param s string字符串 表示第一个整数 * @param t string字符串 表示第二个整数 * @return string字符串 */ string so..原创 2022-03-27 16:25:36 · 1725 阅读 · 0 评论 -
NC151 最大公约数 牛客题霸(辗转相除法)
class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 求出a、b的最大公约数。 * @param a int * @param b int * @return int */ int gcd(int a, int b) { // write code here return b == 0 ? a :.原创 2022-03-27 15:40:33 · 151 阅读 · 0 评论 -
NC105 二分查找-II 牛客题霸
二分的思想,我之前写过一篇博客,可以参照一下基础算法class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 如果目标值存在返回下标,否则返回 -1 * @param nums int整型vector * @param target int整型 * @return int整型 */ int search(vector<i..原创 2022-03-26 22:47:13 · 264 阅读 · 0 评论 -
NC65 斐波那契数列 牛客题霸
一、 NC 65在递归的过程中,越往下走,重复计算的数就越多;记忆化搜索算法class Solution { public: int Fibonacci(int n) { // 用递归很慢,这里我们可以考虑把中间的值存下来,不用重复计算,dp数组 int dp[105]; dp[1] = 1; // 初始化斐波那契数列,这里我让下标从1开始,比较好算 dp[2] = 1; if (n < 3) {原创 2022-03-26 21:25:18 · 501 阅读 · 0 评论 -
NC4 判断链表中是否有环牛客题霸
关键思路:创造两个指针,一个走的快(一次走两个结点),一个走的慢(一次走一个结点),若是存在环的话,两个快慢指针一定会相遇(因为在环中,两个快慢指针的距离会每次缩小1,直到相遇,画个图模拟一下);若无环,就会走到NULL;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(N..原创 2022-03-26 20:19:00 · 1893 阅读 · 0 评论 -
NC22 合并两个有序的数组牛客题霸
有序数组的合并,我们很容易想的到双指针思想(这个跟归并排序二分后再合并数组这一步一样),但是这里要注意一下,我们还是要把数据存回A数组中,而不断的移动数字插入是很浪费效率的,题目中又说A数组有足够的空间存放B数组,且A数组的空间大小为m + n,也就是说,我们可以想到:如下画图演示;class Solution {public: void merge(int A[], int m, int B[], int n) { int lenOldA = m - 1; // 原先A..原创 2022-03-26 16:01:26 · 417 阅读 · 0 评论 -
NC34 不同路径的数目(一) 牛客题霸
关键思路:class Solution {public: /** * * @param m int整型 * @param n int整型 * @return int整型 */ int uniquePaths(int m, int n) { // write code here int dp[115][115]; // 定义dp数组 // 初始化第一行和第一列..原创 2022-03-26 15:27:47 · 375 阅读 · 0 评论 -
NC141 判断是否为回文字符串 牛客题霸
NC 103 反转字符串 的其中一个思路有点像回文串就是正读和反读都一样的字符串;所以也可以先反转字符串,再将前后两个字符串比较;class Solution {public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param str string字符串 待判断的字符串 * @return bool布尔型 */ bool judge(string str) { .原创 2022-03-25 22:21:42 · 247 阅读 · 0 评论