
C/C++
阿袁的小园子
这个作者很懒,什么都没留下…
展开
-
快速排序(C++版)
//算法void quick(keytype k[ ],int left,int right){ int i, j; keytype pivot; if(left<right){ i=left; j=right+1; pivot = k[left]; while(1){ while(k[++i]<pivot &&原创 2021-05-29 22:46:05 · 154 阅读 · 0 评论 -
编辑距离(洛谷&牛客)
参考知乎上的这个答案,DP问题可归结为以下3个步骤确定数组的含义数组元素之间的关系数组初始化本篇文章便按以上3个步骤来说一下确定数组含义:dp[i][j]表示要把长度为i的字符串1转成长度为j的字符串2所需的最少步骤,即把word1[0~i-1]转成word2[0~j-1]所需的最少步骤数组元素之间的关系:如果word1[i-1]==word2[j-1],那么只需要把word1[0~i-2]转成word2[0~j-2]即可,所以dp[i][j]=...原创 2021-05-27 18:21:50 · 481 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
题意理解:实现带指针结构体的深拷贝。深拷贝和浅拷贝的区别主要在于拷贝一个带引用或者指针的结构体时,深拷贝会开辟一块新内存,然后让克隆体的指针或引用指向这块内存;浅拷贝则不会开辟新内存,而是让克隆体的指针或引用直接指向原内存。可以参考如何理解 C++ 中的深拷贝和浅拷贝?回到这到题目就是,拷贝一个节点时,不能仅仅把人家的val拷贝进去,random指针的指向、next指针的指向也要考虑,否则就可能出现我明明克隆体的random指针指向节点的val都对了,为什么还是报Random pointer of n.原创 2021-04-11 16:03:07 · 376 阅读 · 0 评论 -
给定一个入栈序列A和另外一个序列B,判断这个序列B是不是这个入栈序列A的出栈序列
这个问题有个名字叫做“栈混洗”,经典的不合法出栈序列是那个1,3,2出栈序列,详情请看学堂在线-数据结构(上)不过这里记录的是从编码的角度去解决栈混洗问题,题目链接:剑指offer31入栈序列是pushed,待判断的序列是popped,算法思想就是用一个辅助栈s,同时用一个变量pop_i记录出栈序列中的当前元素;遍历pushed数组,然后对于每一次入栈操作,都循环判断一次入栈的元素是不是出栈序列中的当前元素,如果是就从s中弹出该元素,并且pop_i++;遍历pushed完成后,判断s是否为空,若为空则说原创 2021-04-08 17:58:47 · 473 阅读 · 0 评论 -
剑指offer:正则表达式匹配
leetcode链接1.dp[i][j]表示s[0~i-1]和p[0~j-1]的匹配情况,为true则说明可以匹配,为false则说明不可以匹配2.如果p[j-1]==’*’,那么可以选择将p[j-2]和s[i-1]进行匹配(这样的前提是p[j-2]==s[i-1],这时候dp[i][j]=dp[i-1][j]),也可以不匹配(这时候dp[i][j]=dp[i][j-2])3.如果p[j-1]=='.'或者p[j-1]==s[i-1],那么直接看s[0~i-2]和p[0~j-2]的匹配情况,即dp原创 2021-04-05 16:57:59 · 147 阅读 · 0 评论 -
洛谷P1896(状压DP)
直接说思路:先解释一下什么叫“状态”:状态也就是每一行若干个国王的摆放方案,比如棋盘为3×3,我们在第1行的第1个格放国王,第二个格不放,第三个格放,那么这一行的状态为101(即放了国王就记为1,不放国王就记为0),这种状态满足国王之间隔着至少一个空格,是合法的,所以我们称之为合法状态,这个状态转成十进制就是5;如果是第1个格和第2个格都放了1,第3个格不放,那么这一行的状态为110,两个国王挨着了,所以是不合法状态,这个状态转成十进制就是6用到的关键数据结构:state数组:存每一行合法的原创 2021-03-25 00:07:47 · 359 阅读 · 0 评论 -
清华2017上机题目-扫雷
题目不难,就是比较耗时间,从看题目到debug我大概用了3个半小时这里主要是记录一下我当时没看懂的点:1.什么叫空白方块?空白方块就是说对于每个方块来说,它有3种状态:被标记为“探明”被插了旗子既没有被探明,也没有被插旗子,这种状态下的方块就叫空白方块注意,方块的状态和这个方块有没有炸弹是无关的上代码:#include <bits/stdc++.h>#define maxn 1005using namespace std;struct node{ int原创 2021-03-23 21:00:06 · 320 阅读 · 1 评论 -
洛谷P1577 切绳子题解
洛谷P1577切绳子1.先来理解一下题意,所谓的k段,并不是刚好切成k段,而是至少可以切成k段,然后看这些切出来的等长的绳子长度最多可以是多少2.思路:二分,left=0,right=单段绳子的最大长度,每次用mid=(left+right)>>1,这个mid值去计算,总共可以切成多少段长度为mid的小绳子,记这个数量为cnt;如果cnt<k,说明mid太大,需要减小;如果cnt>=k,说明按mid来切割的话,可以切成至少k段长度为mid的小绳子,于是用ans记录这个mid值,然原创 2021-03-10 19:30:43 · 1361 阅读 · 1 评论 -
2~36进制之间大数的转换
转换的原理参考:九度OJ 十进制VS二进制核心代码如下,包括两个初始化函数,1个判断函数,1个转换函数//把int转成char,用于输出map<int,char> mp;//把char转成int,用于计算map<char,int> mpci;void init(){ for(int i=0;i<10;i++){ mp[i]='0'+i; } for(int i=10;i<36;i++){ mp[i]='原创 2021-03-08 01:23:06 · 257 阅读 · 0 评论 -
python、C++数字和字符串互相转化
还是这样简单直接一点,博客的可复阅性也会好一点。这个点虽然简单,可每次要用到的时候都会想不起来,还是记录一下好一点str(x ) 将对象 x 转换为字符串实例:>>> a=0>>> b=str(a)>>> b'0'...原创 2019-03-18 23:20:20 · 60513 阅读 · 1 评论 -
洛谷P2758的空间优化
主要参考的是这个回答:知乎#include <bits/stdc++.h>using namespace std;string a,b;const int maxn=2005;int dp[maxn];int main(){ cin>>a>>b; int lena=a.size(); int lenb=b.size(); for(int i=0;i<=lenb;i++){ dp[i]=i; }原创 2021-03-04 13:31:24 · 159 阅读 · 1 评论 -
洛谷P1127
参考的是这篇题解:洛谷P1127原博客讲的很清楚了,主要就是用单词作为边来建图+字典序排序+深度遍历找欧拉路径。我用下面这个测试用例补充两个地方的解释3adccaaaaa为什么要倒序加边说白了就是因为是升序排序+深度遍历倒序加边是这部分代码for(int hd,tl,i=n;i>=1;i--){ hd=a[i][0]-'a'+1; tl=a[i][a[i].size()-1]-'a'+1; add(hd,tl,i); }原创 2021-02-15 12:30:11 · 293 阅读 · 0 评论 -
洛谷P1174打砖块
主要参考自:https://www.cnblogs.com/lee454207074/p/11613962.html文章目录1.思路解释1.思路解释借子弹:就是比如我给前i-1列分配了j-p颗子弹,给第i列分配了p颗子弹,但是实际上由于Y砖块的存在,我可以让前i-1列借几颗(记为x)子弹给第i列,这样第i列就可以用p+x颗子弹了,然后我一直打第i列的砖块,打完这p+x颗子弹后,由于打到了一些Y砖块,所以就还剩x颗子弹,然后再还给前i-1列s_image[i][cnt]:用cnt颗子弹(包括从其它列原创 2021-01-27 23:00:04 · 357 阅读 · 0 评论 -
求最小偏心距
洛谷P1099参考的是这篇题解:完整代码:https://www.luogu.com.cn/blog/123hei/solution-p1099基于以上代码的详细讲解:https://www.luogu.com.cn/blog/leathermanfuckyou/solution-p1099本文也是基于第一篇博客代码在讲解上的一些补充,设计的知识点有链式前向星dfs求树的直径树上尺取文章目录0.链式前向星1.求树的直径2.dis[]数组3.树上尺取4.继续探索(选取的路径就是直径怎么办)原创 2021-01-22 16:43:02 · 722 阅读 · 0 评论 -
关于对拍
参考自:https://blog.youkuaiyun.com/C20190102/article/details/82944384不过原文多余的话真的有点多啊,在此基础上我写个精简点的对拍的组成需要3个可执行程序:WA_program.exeAC _program.exerand.exe以及1个脚本文件:dp.bat脚本文件的内容如下:@echo off:loop 数据生成器位置 > data.txt WA程序的位置 < data.txt > WA.txt AC程原创 2021-01-09 16:38:47 · 103 阅读 · 1 评论 -
THU2020年考研机试题解
有一些题目我做不来,暂时也没搜到令人满意的答案,欢迎评论区补充呀文章目录20201.统计次数1.1题目来源1.2 AC代码2.等差数列2.1题目来源2.2 代码(待完善)20201.统计次数时间限制: 1.0 秒空间限制: 512 MB题目描述给定两个正整数 n 和 k(1≤k≤9),求从 1 到 n 这 n 个正整数的十进制表示中 k 出现的次数。输入格式从标准输入读入数据。输入的第一行包含两个正整数 n 和 k,保证 n≤106 和 1≤k≤9。输出格式输出到标准输出。输出一个原创 2021-01-06 00:26:23 · 816 阅读 · 1 评论 -
补码的运算与比较----c语言中若 int x,y 若 x>y,则-x<-y是对还是错?
这种问题,我个人会在整数表示、两个数比较时应该用哪种量纲去比较,这两个方面纠结一下,下面来逐一解答:1.整数表示:既然是int,那么取负数后还是int,其实就是补码取负后,还用补码表示2.量纲:还是根据int的补码规则去解析这个补码好像也说不太清楚,其实x到-x就是进行正常的补码运算,如果越界了就把溢出的那部分直接截掉;而-x和-y进行比较,就是把这个补码解析成十进制整数回到文章标题,c语言中若 int x,y 若 x>y,则-x<-y是对还是错?取y=-231,则y=10…0(2)原创 2020-11-30 23:18:07 · 1317 阅读 · 0 评论 -
图的深度遍历(邓俊辉版)
文章目录一、说在前面二、代码实现和输出一、说在前面邓老师把图的边分成了4种:tree,backward,forward,cross。个人觉得,这样分的意义就在于对遍历树来说,原图的各条边各自有什么意义:tree:这条边是遍历树的一条树枝。backward:原图中存在这么一条边:v->u,但是在遍历树中,u是祖先,v是后代,所以在原图中,这就是一条孩子指向祖先的边(大逆不道.jpg),类似于(i)中的G->A。forward:原图中存在这么一条边:v->u,而且在遍历树中,v是u的原创 2020-10-30 16:52:06 · 314 阅读 · 0 评论 -
输入数组名和数组长度,打印数组内容,函数名称为printArray
void printArray(int a[],int len){ int i=0; for(;i<len;i++){ printf("%d ",a[i]); } printf("\n");}原创 2020-10-07 09:26:35 · 2519 阅读 · 0 评论 -
用swap函数交换两个变量的值
void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp;}原创 2020-10-07 00:20:17 · 1909 阅读 · 0 评论 -
棋盘覆盖方案
这份PPT讲得很详细:百度文库记t为要放下的第t颗L形棋子,主要思路就是在放第t枚旗子时,先通过4个if else分支判断空出来的棋格在左上、右上、左下、右下4个部分的哪个子区域;一、用左上的这个分支来举个例子:1.在每次的chess函数调用中,[tr][tc]是当前子棋盘的左上棋格的坐标,[dr][dc]是当前子棋盘的空棋格的坐标,size是当前子棋盘的边长2.如果空棋格在左上子棋盘中,那么进入if分支的chess(tr,tc,dr,dc,sz)函数中进行进一步的递归3.否则进入else分支,先原创 2020-09-17 16:00:17 · 314 阅读 · 0 评论 -
用O(logN)的时间复杂度计算斐波那契数列的第n项
具体原理请参考这篇博客:https://blog.51cto.com/helloleex/1769253本篇只记录算法的实现,主要涉及的知识点有矩阵乘法和用O(logn)的时间复杂度计算矩阵的n次幂这里算的是3以及3以上的斐波那契数:#include <stdio.h>#include <malloc.h>struct Matrix{ int a[2][2];};//矩阵乘法Matrix matrixmulti(int a[][2],int b[][2])原创 2020-09-14 13:14:25 · 502 阅读 · 0 评论 -
C语言返回二维数组
以计算两个2×2矩阵的矩阵乘法为例:int ** matrixmulti(int a[][2],int b[][2]){ int **c=(int **)malloc(2*sizeof(int *)); int i=0,j=0,k=0; for(;i<2;i++){ for(;j<2;j++){ c[i][j]=0; for(;k<2;k++){ c[i][j]+=a[原创 2020-09-14 10:45:48 · 3014 阅读 · 1 评论 -
专业课错题记录(数据结构)
五、二叉树1.高度为h的满二叉树有多少个节点?(A)A.2h+1−1B.2h+1C.2h−1D.2h解析:这里的h是高度,不是层次,两者的对应关系应该是高度h=总的层级数-12.设二叉树有n个节点,高度为h.在其中插入一个新的节点,高度发生改变的节点个数为:CA.O(1)B.O(n)C.O(h)D.O(hlog2(n))解析:这个题也是做的我一脸懵逼,这不是和插入的位置有关吗?看了答案才知道,原来问题想说的可能是插入一个叶子节点。答案的解析是,插入的节点的这条路径上所有的节点的高度都原创 2020-07-03 12:30:15 · 3540 阅读 · 0 评论 -
prim算法求最小生成树过程解析
文章目录一、原理二、所需数据结构三、prim代码实现(含思路解析)四、解题完整代码:4.1 题目4.2 AC代码一、原理我直接贴我们课件的截图吧:二、所需数据结构总结起来就是一个结构体+一个二维数组+3个一维数组1.需要一个结构体来存储边的信息,包括边的id和权重:typedef struct line{ int weight; int id;}line;2.用二维数组来存储这个图:line G[maxver][maxver];3.一个edges[maxver]数组原创 2020-05-30 12:17:40 · 3244 阅读 · 0 评论 -
邓俊辉老师数据结构课程笔记
一、绪论1.复杂度分析的主要方法迭代:级数求和递归:递归跟踪+递推方程猜测+验证2.级数的分类和计算:最下面的调和级数和对数级数是后面要经常用到的原创 2020-05-26 00:29:22 · 3822 阅读 · 0 评论 -
二叉树的查找路径
节点的结构typedef struct BTNode{ char c; struct BTNode *lchild,*rchild;};算法char road[100];int top_road=-1;//在祖先树中找结点BTNodeptr find_node(BTNodeptr np,char c){ BTNodeptr result=NULL; if(np){ road[++top_road]=np->c; if(n原创 2020-05-25 14:32:50 · 2388 阅读 · 0 评论 -
一棵完全二叉树采取顺序存储结构,存储的节点依次存放于一维数组 BT[0..n-1]中,写出中序遍历二 叉树的非递归算法
#include <stdio.h>#include <string.h>#include <malloc.h>#define M 20typedef struct BTNode{ char c; struct BTNode *lchild,*rchild;};typedef struct BTNode * BTNodeptr;BTNodeptr stack[M];BTNodeptr root;//在祖先树中找结点BTNodep原创 2020-05-25 14:00:48 · 4591 阅读 · 0 评论 -
数据结构相关知识(图)
1.关于一条边(弧)的表示1)用图形2)用符号(v1,v2):无向图<v1,v2>:有向图3)用语言2.图的分类:1)边是干干净净的,什么也没有:无向图2)边加个方向:有向图3)边加个权重:网络3.顶点的度:依附于顶点vi的边的数目称为顶点vi的度,记为TD(vi),有向图中还分为出度(以顶点为起点的边的数目,记为OD(vi))和入度(以顶点为终点的边的数目,记为ID(vi))4.完全图:边的数目达到最大的图称为完全图稠密图:边的数目达到或接近最大的图称为稠密图否则,称原创 2020-05-22 17:18:43 · 935 阅读 · 0 评论 -
数据结构相关知识(排序)
1.插入排序:在第i趟排序中,把序列的第i+1个元素插入到前面i个元素组成的有序序列中,使得前i+1个元素变成一个大小为i+1,且有序的序列2.选择排序:第i趟排序中从后面n-i+1个元素中选择一个最小的元素,将其置于这n-i+1个元素的前面。选择排序的元素之间的比较次数和元素的初始排列序列无关,都是要比较(n-1)n/2次3.冒泡排序,这个比较简单,就不说了4.谢尔排序(shell排序):首先确定一个元素的间隔数gap。将参加排序的元素按gap分割成若干个子序列(即把那些位置相隔为gap的元素看作一原创 2020-05-20 13:10:04 · 332 阅读 · 0 评论 -
数据结构相关知识(查找)
1.稠密索引:基本数据中的每一个记录在索引表中都占有一项,比如:2.倒排索引:课程没要求,我就简单看了下,参考这篇文章。倒排索引就是通过关键字来找到相关的文档ID,然后再通过文档ID找到文档内容...原创 2020-05-15 00:08:38 · 290 阅读 · 1 评论 -
银行排队模拟的第12号客人的等待时间为什么是1
假设某银行网点有五个服务窗口,分别为三个对私、一个对公和一个外币窗口。银行服务的原则是先来先服务。通常对私业务人很多,其它窗口人则较少,可临时改为对私服务。假设当对私窗口等待服务的客户(按实际服务窗口)平均排队人数超过(大于或等于)7人时,等待客户将可能有抱怨,影响服务质量,此时银行可临时将其它窗口中一个或两个改为对私服务,当客户少于7人时,将立即恢复原有业务。设计一个程序用来模拟银行服务。说明:...原创 2020-04-19 15:57:30 · 813 阅读 · 0 评论 -
数据结构相关知识(树)
1.树的一个很重要的特点是不会形成回路2.结点的度:该结点拥有的子树的数目3.树的度:树中结点度的最大值4.叶节点:度为0的结点5.分支节点:度非0的结点6.树的层次:根节点的层次为第1层7.树的深度:树中节点所处的最大数8.树的度和结点的度是两个概念,树的度是最大的结点度9.二叉树是有序树,因为它要区分左子树和右子树。反正就是,子树有严格的左右之分且度≤2的树才是二叉树10.具...原创 2020-04-17 00:30:28 · 7213 阅读 · 0 评论 -
中缀和后缀表达式的转换
可以用中缀式(a+b+c)*d-e来实际分析一下1.中缀转后缀:1)设定一个符号栈,并把符号‘#’压入栈中,并规定#的优先级最低2)从左往右扫描表达式,如果是字母就直接发送给后缀表达式3)如果是运算符,就与栈顶的运算符进行比较:i)如果当前运算符优先级大于等于栈顶运算符,则压入栈中ii)如果小于栈顶运算符,则把栈顶运算符出栈并发送到后缀表达式中,然后把当前运算符压入栈中4)如果读...原创 2020-01-01 20:33:31 · 1684 阅读 · 0 评论 -
在字符串s的第n个字符后面插入字符串t
这是我们课件上的一道题,我觉得很巧妙,所以就摘出来了:int insert(char s[],char t[],int n){ strcat(t,s+n); s[n]='\0'; strcat(s,t); return n;}原创 2020-04-10 20:58:28 · 1993 阅读 · 0 评论 -
Windows下查看两个文件的区别
把需要比较的两个文件放到同一个目录,然后在cmd中切换到该目录下,输入FC file1 file2,文件名要包括后缀。示例:结果之一是result.txt比example.txt少了行snake 22...原创 2020-04-06 20:33:44 · 1725 阅读 · 0 评论 -
没有赋初值的指针什么时候是野指针,什么时候是空指针
看一下这段代码,a是全局指针数组,cc是全局指针变量,bb是局部变量//// Created by 17999 on 2020/2/27.//#include <stdio.h>typedef struct word{ int a; struct word *next;}word;typedef word* wordptr;wordptr a[2]...原创 2020-04-06 12:28:52 · 1809 阅读 · 0 评论 -
二分查找的循环条件为什么是left小于等于right,而不是left小于right
我的疑问是为什么不能是简单的小于,而要加个等于,我们来考虑一下下面这种情况:我们判断整数1是否位于数组a[2]={0,1}里面,如果循环条件是left<right,那么第一次查找:left=0,right=1,mid=0,a[mid]<0,left=mid+1=1,此时left==right,跳出循环,查找失败,而这个结果和实际情况是不一致的,所以循环条件不能是left<rig...原创 2020-04-05 23:54:28 · 2828 阅读 · 7 评论 -
C语言计算程序运行的时间
#include <stdio.h>#include <time.h>int main() { clock_t begin, end; double cost; //开始记录 begin = clock(); /*待测试程序段*/ end = clock(); cost = (double)(end - begi...原创 2020-04-04 22:29:22 · 419 阅读 · 0 评论 -
用C语言获取文件的大小
参考文章:通过文件指针来获取文件的大小(fseek与ftell函数 )#include <stdio.h>int main() { FILE *in; //打开文件 in=fopen("article2.txt","r"); //把文件的位置移到文件尾 fseek(in,0,SEEK_END); //获取文件长度 long ...原创 2020-03-31 23:19:51 · 1798 阅读 · 0 评论