笔记
爱一袭铁路
这个作者很懒,什么都没留下…
展开
-
KMP算法的简单运用
https://leetcode-cn.com/problems/repeated-substring-pattern/根据KMP算法的原理,这道题可以很方便地用KMP算法实现我们只需要观察next数组的最后一个元素,如果它可以整除原字符串的长度并且不等于-1,那么它就满足题意void getnext(int *next,string &s){ int j=-1; next[0]=-1; for(int i=1;i<s.size();i++) {原创 2021-04-21 21:51:55 · 49 阅读 · 0 评论 -
KMP算法笔记
https://leetcode-cn.com/problems/implement-strstr/该题需要我们匹配一个与子字符串相同的字符串,如果没有就返回-1看起来只要暴力就可以破除,但是,暴力的解法需要的时间复杂度非常大,一旦字符串的长度开得很大,时间限制更加严格,暴力很可能冲不过去所以,我们可以采用一种比较相同字符串非常著名的方法,KMP算法KMP算法的一个核心就是next数组,如next[i]表示两个值:首先,这个下标 i 表示的是字符的下标,注意,是子串的下标而这个next[i]的值表原创 2021-04-20 23:33:18 · 35 阅读 · 0 评论 -
两条斜线(枚举法)
https://ac.nowcoder.com/acm/problem/18951题目的意思很明确,就是用两条斜率分别为1和-1的直线连接尽可能多的点,而题目的数据并不大,使用可以用暴力的方法直接冲过去思路大致是遍历所给坐标,确定每个点引出两条直线后可以经过的点并比较产生最大值,具体做法是定义两个变量分别赋予坐标相减和坐标相加,再遍历这些点,如果坐标一致,就让答案加一,循环比较输出最大值#include<iostream>#include<algorithm>#includ原创 2021-03-29 23:27:28 · 192 阅读 · 0 评论 -
艺(简单排序)
https://ac.nowcoder.com/acm/problem/15523根据题目的意思,输入有两组数组,分别表示两个台的节目的开始时间及单位愉悦度,因为这两个数据关联性较强,使用我们使用结构体将它们相连。struct kat{ int x = 0, y = 0;};我们用x表示时间,y表示愉悦度在读入数据之后,我们利用函数对其进行排序,然后就是本题的难点首先,我们设定两个变量a1,b1并赋初值0它们表示的是此时两个台是第几个节目然后,我们可以另设一个int型数num1,用它来原创 2021-03-26 22:14:02 · 71 阅读 · 0 评论 -
大佬的生日大礼包(二分法)
二分法的原型大致如下while (l <= r){ int m = (l + r) >> 1; if (m >= key)r = m - 1; else l = m + 1;}其中key可以表示所求量,当m大于所求值时,可以判断key在m的左侧,假设原数据为升序排序,那么就可以将右边界移动至m-1处,也就是m的左侧;反之,如果m小于key,则左边界移动至m的右边。通过不断循环,最终判断key的位置或其是否在数组中。需要注意的是,如果key不在数据中,则最终 l 将原创 2021-03-25 22:30:15 · 205 阅读 · 0 评论 -
多维数组的指针表示
假设有一个二维数组 a[n] [n],那么初始化这个数组int a[3][3] = { 0,1,2,3,4,5,6,7,8 };那么 a[0] 用指针怎么表示呢?事实上,a[0] 与 *a 完全相同并可由此得出,a[1][2],用指针表示为*(a*(a+1)+2)要想理解这一等式可以参考下列式子a 二维数组首元素的地址a+1 二维数组的第二个元素地址 *(a+1) 二维数组的第二个元素的首元素的地址 *(a+1)+2 二维数组的第二个元素的第三个元素地址 *(*(a+1)+原创 2021-02-03 20:59:18 · 540 阅读 · 0 评论 -
extern
extern 可以使用户在多个文件中使用外部变量如int main(){ int m;}void stu(int n){ extern int m;}void ac(int x){ int m;}如果修改stu函数中的m,主函数中的m的值也会改变,但如果在ac函数中使用m,根据局部变量隐藏全局变量的特征,在主函数中的m与ac函数中的m互不干扰...原创 2021-02-02 16:39:19 · 39 阅读 · 0 评论 -
函数重载
函数多态能够让用户使用多个同名的函数,“多态”指的是多种形式,因此多态函数运行函数拥有多种形式。这意味这我们可以通过函数重载来设计一系列函数——它们完成相同的工作,但使用不同的参数列表。可以把函数重载看作有多种含义的动词函数重载的关键是函数的参数列表或称之为函数特征标。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的参数列表相同。在C++中,允许存在相同名称但参数列表不同的函数如:int stu(int x,double y);int stu(double x,int y)原创 2021-02-01 21:45:25 · 60 阅读 · 0 评论 -
内联函数
在一些情况下,反复调用某个函数是比较耗费时间的。毕竟,函数的调用也是需要时间的在C++中,有一种函数类型是内联函数,它的编译代码和其他程序代码串联起来了,编译器将使用相应的函数代码替换函数调用,所以程序不用跳到另一个位置执行代码,但代价是消耗更多内存也就是说,这是用内存换时间的方法每调用一次,程序中就产生一个相应的副本inline int stu(int x){ int m;}在声明函数和定义函数前加上inline就可以了注意,内联函数不能递归...原创 2021-01-31 21:55:19 · 34 阅读 · 0 评论 -
1013 数素数
#include<iostream>#include<cmath>#include<algorithm>using namespace std;int skt(int n)//如果是素数,则返回原值;不是则返回false{ if (n == 1)return 0; if (n == 2)return 2; int x = sqrt(n); for (int i = 2; i <= x; i++) { if (n % i == 0)return原创 2021-01-29 21:54:39 · 57 阅读 · 0 评论 -
C语言中++和--作用的顺序
++和–是C语言中一种非常常用的运算符,但它们的作用机制却不怎么容易弄清楚首先,假设有一个int类型数 a那么,++a;和a++;有什么区别呢?#include<stdio.h>int main(){ int a = 10, b = 10; printf("%d %d\n", a, b); printf("%d %d\n", a++, ++b); printf("%d %d\n", a, b); return 0;}该程序执行结果为10 1010 1111 11原创 2021-01-28 20:46:31 · 1390 阅读 · 0 评论 -
C++基于范围的for循环
for循环在C和C++中都是非常常见的语句结构一般来说,for语句的结构是这样的for(int i;i<=10;i++)事实上,像是for(; ;)这样的语句也是成立的,不过需要跳出循环的条件而在C++中有一种基于范围的for循环,这种循环简化了一种常见的任务:对数组或容器类(如vector或array)的每个元素执行相同的操作比如double a[5] = { 3.1,2.6,5.5,6.5,8.9 }; for (double i : a) printf("%.2f\n", i);原创 2021-01-26 21:39:01 · 410 阅读 · 0 评论 -
线段树入门笔记
线段树是一种搜索型二叉树,可以用它来解决一些使用传统方法非常复杂的问题要实现线段树的应用需要几个模板struct tree{ int l, r; long long n, sum;} node[maxn << 2];上述代码主要用来标识需要的变量,可根据题目需要来填写void build(int l, int r, int i)//建立线段树{ node[i] = { l,r }; if (l == r)//如果左右边界相等 { node[i].sum原创 2021-01-25 21:31:25 · 33 阅读 · 0 评论 -
使用new创建动态结构
有时候我们会需要创建一个动态数组来储存一些用静态数组不方便存储的数据,而这次,我们通过new像创建动态数组那样创建动态结构首先创建一个未命名的结构类型,将其命名为skd struct skd { int a; char b[100]; double c; };然后,我们就可以把它的地址赋给一个指针型变量skd* p = new skd;//(在C++中结构变量前可以省略struct)如需访问成员,可以使用 ->进行访问p->a;上面这串代码意思是访问结构的a成员原创 2021-01-24 21:31:50 · 109 阅读 · 0 评论 -
单数组向右循环移动n位
1008 数组元素循环右移问题一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1 )变换为(N−M⋯AN−1 A0 A1 ⋯AN−M−1 )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。输出格式:在一行中输出原创 2021-01-23 21:07:50 · 902 阅读 · 1 评论 -
并查集
find3(x){ r = x; while (set[r] <> r) //循环结束,则找到根节点 r = set[r]; i = x; while (i <> r) //本循环修改查找路径中所有节点 { j = set[i]; set[i] = r; i = j; }}...原创 2021-01-21 20:41:35 · 39 阅读 · 0 评论 -
C++代码格式化
在C++中,回车的作用和空格相似,即C++中可以吧一条语句放在几行上或把几条语句放在同一行上。有时候这样写不怎么美观,并且也需要遵守一些规则,比如,不能把空格制表符和回车放在元素中间。多数人所使用的代码风格:每条语句占一行每个函数都有两个各占一行的花括号函数中的语句都对花括号进行缩进与函数名称相关的圆括号周围没有空白#include<iostream>#include<stack>#include<cstdio>#include<string.h原创 2021-01-20 23:17:39 · 655 阅读 · 0 评论 -
C语言运算符优先级
在C语言中,运算符优先级是一个比较麻烦的概念,如果搞不清楚优先级可能会产生一些难以察觉的错误第一优先级:[ ] ( ) . ->第一优先级包括方括号,圆括号,对象,对象指针第二优先级:- ~ ++ – * & ! ( 类型 ) sizeof第二优先级包括取负,按位取反,自增,自减,取值运算符,取地址符,逻辑非运算符,强制类型转换,长度运算符第三优先级: / * %第三优先级包括乘法,除法,取模第四优先级:+ -表示加法,减法注意第四优先级原创 2021-01-17 16:06:55 · 9646 阅读 · 0 评论 -
判断一个数是否为完全平方数
假设有一个数 n ,现要求判断它是否为完全平方数假设n为四位数m=floor(sqrt(n)+0.5);//m是输出量if(m*m==n)printf("%d\n",n);如果写成if(sqrt(n)==floor(sqrt(n)))printf("%d\n",n);就容易出现问题因为函数在计算过程中可能会出现误差,比如因为误差导致1变成0.9999,因此输出0而不是1为避免出现以上情形,一般会在floor后面加上0.5以四舍五入且sqrt函数所消耗的时间较长,如在循环中使用它,条原创 2021-01-16 20:23:56 · 481 阅读 · 0 评论