
数据结构和算法
Star星屹程序设计
编程新手,个人记笔记,方便日后看,很多东西记着只是为了自己方便。。喷子请绕道!!!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[循环链表]——单向循环链表
单向循环链表与普通链表的区别在于:普通链表的最后一个链表的next指向NULL,而单向循环链表的最后一个节点的next指向头结点原创 2022-02-24 17:55:47 · 5354 阅读 · 0 评论 -
[数据结构]——通用链表
这里实现的链表是内核链表的一个简单优化,在内核链表中next指针放在数据的尾部,定位指针域需要计算偏移量,增加了处理难度。优化后将next指针放在数据块的开头,免去了偏移量的计算。头文件:#ifndef LINKLIST_H#define LINKLIST_H#include <stdio.h>#include <stdlib.h>#include <string.h>//挂钩typedef struct LINKNODE { str..原创 2022-02-16 15:01:33 · 713 阅读 · 0 评论 -
[数据结构]——线性表
一、线性表的顺序存储结构1、头文件// 防止头文件重复包含#ifndef DYNAMIC_ARRAY_H#define DYNAMIC_ARRAY_H#include <stdio.h>#include <stdlib.h>#include <string.h>//线性表的顺序存储:用一块连续的存储空间//动态增长内存,将真正存放数据的内存放到堆上//动态数据 5个元素,空间不足,申请内存,拷贝数据,释放旧存储 capacity//实现先原创 2022-02-09 20:59:59 · 989 阅读 · 0 评论 -
[数据结构]——基础概念
数据结构主要研究非数值计算问题的程序中的操作对象以及它们之间的关系,不是研究复杂的算法。数据结构是计算机存储、组织数据的方式。算法是特定问题求解步骤的描述,在计算机中表现为指令的有序序列,算法是独立存在的一种解决问题的方法和思想。对于算法而言,语言并不重要,重要的是思想。算法和数据结构的区别: 数据结构只是静态的描述了元素之间的关系,高效的程序需要在数据结构的基础上设计和选择算法 算法是为了解决实际问题而设计的 数据结构是算法需要处理的问题载体 数据结构与算.原创 2022-02-08 13:46:51 · 297 阅读 · 0 评论 -
DFS中的概念——树边、回溯边、前向边、交叉边
根据在有向图G上进行深度优先遍历所产生的深度优先森林,可以把图中的边分为四类:树边:(Tree edge) 后向边:又称 回溯边(Back edge) 前向边:(Forward edge) 交叉边:(Cross edge) 树边,前向边,后向边,横叉边,应该说,不是一个图本身有的概念,应该是图进行DFS时才有的概念。图进行DFS会得到一棵DFS树(森林),在这个树上 才有了这些概念。对图进行DFS,可以从任意的顶点开始,遍历的方式也是多样的,所以不同的遍历会得到不同的DFS树,进而产生不同的..原创 2021-09-08 22:26:50 · 6202 阅读 · 0 评论 -
链表基础问题(C++)
一、链表反转(逆序)设置一个new_head代表反转后的头节点#include <stdio.h>struct ListNode{ int val; ListNode *next; ListNode(int x):val(x), next(NULL){}};class Solution{public: ListNode* reverseList(ListNode* head){ ListNode* new_head = NULL; //指向新链表头节点的指针原创 2021-01-07 10:36:05 · 778 阅读 · 0 评论 -
之字形打印矩阵_C++
#include<iostream>#define MAXROW 3#define MAXCOL 4using namespace std;//打印之字形矩阵//压中的点是每条对角线最右上的点(tR,tC)和最左下(dR,dC)的点//右上点的移动逻辑:每次往左移动,移动不了了往下移动//左下点的移动逻辑:每次往下移动,移动不了了往右移动//upToDown:从上往下void printDiagonal(int m[][MAXCOL],int tR,int tC,int ...原创 2020-08-25 20:42:27 · 651 阅读 · 0 评论 -
螺旋打印矩阵(顺时针)——C++
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 45 6 7 8910 11 121314 15 16则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.#include <iostream>#include <algorithm>#include <vector>using namespace std; vector<i...原创 2020-08-25 10:10:29 · 1860 阅读 · 3 评论 -
生成窗口最大值数组
思路:双端队列,将arr中的元素加入res该队列中,若该队列的队尾元素小于等于要加入的元素,则不断的弹出,直到队尾元素大于该元素或者队列为空。此时将该元素的序号加入队列中。同时当 i-w == 队头的序号,则将队头元素弹出。#include <iostream>#include <deque>#include <vector>using namespace std; vector<int> getMAXWindow(vector<in..原创 2020-08-19 10:49:57 · 326 阅读 · 0 评论 -
栈内元素逆序(不申请额外数据结构)
题目描述:一个栈依次压入1、2、3、4、5,那么从栈顶到栈底分别为5、4、3、2、1。将这个栈转置后,从栈顶到栈底即为1、2、3、4、5,也就是实现栈中元素的逆序,但是只能用递归函数实现,不能用其他数据结构。代码实现:(C++2.0)#include <iostream>#include <vector>using namespace std;class ReverseStack {public: vector<int> reverseStac.原创 2020-08-18 15:03:35 · 708 阅读 · 0 评论 -
队列实现栈&栈实现队列
一、两个队列实现栈结构定义两个队列,一个队列为存储队列(m_q1),另一个队列为中转队列(m_q2)。入栈时直接压入queue1中,出栈时先将除queue1最后一个元素外依次pop出队列,并压入queue2,将留在queue1中的最后一个元素出队列即为出队元素,之后将queue2中的元素压回queue1中#include <iostream>#include <queue>using namespace std;class MyStack{public: MySta原创 2020-08-17 16:02:56 · 397 阅读 · 0 评论 -
一致性哈希问题(consistent hashing)
一致性哈希算法(Consistent Hashing)最早在论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》中被提出。简单来说,一致性哈希将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希空间环如下:...原创 2020-08-16 15:44:12 · 631 阅读 · 0 评论 -
荷兰国旗问题及随机快速排序(C++11)
函数partitionQucikSort问题的解,这里返回值我们返回的是给定targetNum 相等的元素的下标,包含坐下标index[0],右部分index[1]。其中<index[0]部分都是< targetNum, index[0]~index[1]之间都是==targetNum,>index[1]部分都是>targetum。原创 2020-08-08 22:12:03 · 1082 阅读 · 0 评论 -
动态规划
动态规划概述题目一:斐波那契数列问题#include<iostream>using namespace std;const int maxn = 100;int dp[maxn] = {-1};int Fab(int n){ if(n == 0 || n == 1){ return 1; //递归边界 } if(dp[n] != -1){ return dp[n]; //已经计算过,直接返回结果 }e原创 2020-08-03 17:15:14 · 340 阅读 · 0 评论 -
杭电OJ-1005
注:本题直接做内存有点不够用,可以发现,结果都是mod7,所以变化范围也就在0~6,所以会出现7*7种情况,之后再有就又循环回来了#include <cstdio>int main(void){ int a, b, n; while(scanf("%d%d%d", &a, &b, &n) != EOF, !(a == 0 && b == 0 && n == 0)){ int arr[50]; arr[1] ..原创 2020-06-21 16:31:39 · 468 阅读 · 0 评论 -
杭电OJ-1004
#include <iostream>#include <string>#include <functional>#include <map>using namespace std;int main(void){ int n; string str; while(scanf("%d", &n) != EOF){ map<string, int> myMap; map<int, string, greate...原创 2020-06-21 15:30:16 · 519 阅读 · 0 评论 -
杭电OJ-1003
最大连续子序列和:状态方程:dp[i] = max(a[i], a[i] + dp[i-1])#include <cstdio>#include <algorithm>using namespace std;const int maxn = 100010;int a[maxn];struct node{ int start; int total;};node dp[maxn];int main(void){ int t; scanf("%d", &a..原创 2020-06-21 10:57:08 · 417 阅读 · 0 评论 -
杭电OJ-1001
注:没有固定个数的读法:while(scanf("%d", &n) != EOF)此时,当在Dos框里输入数据时,并不会触发EOF状态。因此如果想要在输入时手动触发EOF,可以按<ctrl + Z>组合键,完了再按下<Enter>键结束while循环#include <cstdio>int main(void){ int n, sum = 0; while(scanf("%d", &n) != EOF){ for(int i = 1..原创 2020-06-20 15:00:26 · 411 阅读 · 0 评论 -
杭电OJ-1002
特别注意:输出是,如果没有到达n时,是两个换行,到达n个用例输出是是一个换行#include <cstdio>#include <cstring>struct bign{ int d[1001]; int len; bign(){ memset(d, 0, sizeof(d)); len = 0; }};bign change(char str[]){ bign a; a.len = strlen(str); for(int i = 0;..原创 2020-06-20 12:24:38 · 1022 阅读 · 1 评论 -
杭电OJ-1000
注意:Process to end of file:处理到文件结束#include <cstdio>int main(void){ long long a, b; while(scanf("%lld%lld", &a, &b) != EOF){ printf("%lld\n", a+b); } return 0;}原创 2020-06-20 11:26:48 · 407 阅读 · 0 评论 -
计算机机试题(未完善)
1、2019南大计算机本科开放日机试题(最小新整数)给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?例如: n = 9128456, k = 2, 则生成的新整数最小为12456输入第一行t, 表示有t组数据;接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。输出t行,每行一个数字,表示从n中删除k位后得到的最小整数。样原创 2020-06-17 23:03:46 · 605 阅读 · 0 评论 -
常用排序算法
排序目的:将无序的数据调整为有序序列1、冒泡排序(1)基础实现void bubble_sort(int *a, int n){ int i, j, t; for(i = 0; i < n-1; i++){ for(j = 0; j < n-1-i; j++){ if(a[j] > a[j+1]){ t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } }}(2)简单优化void bubb原创 2020-06-13 11:15:02 · 460 阅读 · 0 评论 -
二叉树的确定
二叉树的遍历方式分为:先序遍历、中序遍历、后序遍历、层次遍历其中,中序序列与先序序列、后序序列、层次序列,两两组合均能确立一个唯一的二叉树1、中序序列和先序序列事实上,如果递归过程中当前先序序列的区间为[preL, preR], 中序序列的区间为[inL, inR], 那么左子树的节点个数为:numLeft = k - inL。这样左子树的先序序列区间就是[preL+1, preL ...原创 2020-02-25 12:05:57 · 1412 阅读 · 0 评论 -
蓝桥杯基础
1、循环节长度:两个整数做除法,有时会产生循环小数,循环小数的长度即为循环节11/13 = 0.846153846153,其中循环节为6注:求循环节时,可以通过判断两次取模出现相同值作为中止条件。int fun(int n, int m){ n = n % m; vector<int> v; for(;;) { v.pus...原创 2020-02-13 10:37:56 · 471 阅读 · 0 评论 -
PAT小结
1、double类型的变量,在赋值时必须用1.0去乘要赋的值,否则会出现dou输出值为整型double dou = 1.0 * abs(n)/x;2、处理字符串时常用atoi(const char *str); 用于c字符串转换为整型stoi(const string &str); 用于c++字符串转换成整型c++字符串为空时,使用stoi会报错,这是建议使用at...原创 2019-10-05 22:05:31 · 336 阅读 · 0 评论 -
csp游戏模拟
#include <vector>#include <iostream>using namespace std;int main(void){ int n,k; int num = 1; // 第一个小孩报的数 int count = 0; //淘汰的人数 cin >> n >> k; vect...原创 2019-09-30 17:47:06 · 661 阅读 · 1 评论 -
blJS
#include <iostream>#include <algorithm>#include <string>#include <vector>using namespace std;struct stu{ string name; int score[3]; int sum; double avg...原创 2019-09-30 15:04:33 · 1152 阅读 · 0 评论 -
csp——ISBN号鉴别
#include <iostream>using namespace std;int main(void){ char isbn[15]; cin >> isbn; int m = ( (isbn[0]-48)*1 + (isbn[2]-48)*2 + (isbn[3]-48)*3 + (isbn[4]-48)*4 + (isbn[6]...原创 2019-09-29 13:52:50 · 433 阅读 · 0 评论 -
csp考题——买菜,卖菜
1、买菜C++代码实现:#include <cstdio>#include <functional>#include <vector>using namespace std;int main(void){ int n, ret = 0; scanf("%d", &n); vector<pair<...原创 2019-09-27 17:35:27 · 759 阅读 · 0 评论 -
通用链表——C实现
传统的链表通常内部存储的数据节点写固定,数据变更时非常繁琐;通用链表则解决了这个弊端,它采用指针的方式对数据进行存储,根据具体的数据类型确定步长,因此具有一定的实用性头文件#include<stdio.h>#include<string.h>#include<stdlib.h>#pragma warning(disable:4996)#d...原创 2019-09-15 10:22:02 · 460 阅读 · 0 评论