The Pragmatic Programmer
Programming is a craft. At its simplest, it comes down to getting a computer to do what you want it to do (or what your user wants it to do). As a programmer, you are part listener, part advisor, part interpreter, and part dictator.You try to capture elusive requirements and find a way of expressing them so that a mere machine can do them justice. You try to document your work so that others can understand it, and you try to engineer your work so that others can build on it. What’s more, you...
switch连接openwrt路由器NAT穿越失败问题
因为一个简单的设置导致度过了痛苦的几个小时的解决问题的时间
springboot中jwt的使用
在项目中引入jwt
MyBatis-Plus的使用
项目初始添加MyBatis-Plus和自动生成代码
考研回忆
总之非常痛苦的复习之旅终于结束了,也算是大战以后终于解放了。12月份真的是眨眼之间就过去了,经验++。
关于自主学习
关于自主学习最近也是因为在考研,休闲时间会看《觉醒年代》,今天看到一个英语作文在讲激励式教育。 激励式教育并不可取,因为如果激励消失后,孩子很难再有动力去学习。 学习究竟是为了什么,这个问题着实需要自己认真思考一下。 小学到大学的学习可能都只是仅仅想要升学到更好的学校。所以只需要按部就班的学习,做对试卷上的题目就能一天天混日子。从来没有想过学习本身到底是什么。学习本身绝不仅仅是背许多课文,学许多英语单词,考很高的分数。 为什么要学习?直到高考后选择专业时可能才是某些人第一次问自己想要干什么的时间。自己的理想和梦想的设立,决定和影响着我们人生未来的发展。但是长达九年的义务教育,是否给自己树立了正确的人生观价值观世界观呢?我自己当然是想成为一名程序员,因为电脑工作者很酷,很帅,能够解决很多有趣的问题,实现很多便利的功能。 那么实现自己的梦想就是需要学习。到了大学之后就不全是老师带着学生死磕课本的学习模式了,自主学习会逐渐成为大学生学习的常态。你想要成为前端工程师,那就去自学html,js,css,vue,react等,想要当后端工程师就要努力钻研spring...
第36次CCF CSP计算机软件能力认证记录
第36次CCF CSP计算机软件能力认证记录本次应该是我最后一次参加CSP了,明年就毕业了。遗憾的是这次也仅仅只是拿了300分。需要走的路还很远很远。 今天去官网看见能把代码下载下来了,就记录一下。 然而这并不是完整的题解,只是我自身心路历程的记录。如果想看完整的题解的话我推荐这篇博客 第一题简单模拟签到题。 12345678910111213141516171819202122232425262728293031323334353637383940414243#include<bits/stdc++.h>using namespace std;const int mxlen = 200;int n,k;int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};int types(char c){ if(c=='f') return 0; if(c=='b') return 1; if(c=='l')...
毕业设计day0
Day 0此为记录毕业设计中代码实现功能记录的系列。 创建项目目前只是创建了项目初始文件和git仓库,由于尚未完成,所以github仓库暂为私有不公开状态。 后端 SpringBoot创建项目截图如下: Maven仓库,java17,jar包,Spring Boot 3.3.5,预装插件为 MySQL Driver,Lombok,Spring Web 前端 Android创建截图如下: java编写, Minimum SDK:API24(Android 7.0),Groovy DSL 构建。 因为感觉好玩,初始选了Android Studio给的Navigation Drawer Views Activity,现在用这种布局的软件比较少,打算做一个和小红书差不多的。
排序
排序在数据结构中,排序(Sorting)指的是将一个数据集合中的元素按指定顺序重新排列的过程。排序是计算机科学的基本操作之一,对数据处理和分析具有重要作用。排序的结果通常是按从小到大(升序)或从大到小(降序)排列的有序序列。 排序的基本概念 内部排序和外部排序: 内部排序:数据量较小,能够将所有待排序的记录一次性加载到内存中完成排序。 外部排序:数据量较大,无法一次加载到内存中,需要借助外存(如硬盘)分批次处理并排序。 稳定性: 稳定排序:若两个相等的元素在排序前后的相对位置不变,则排序算法是稳定的。例如,若记录有相同的键值,稳定排序会保持它们的初始顺序。 不稳定排序:可能会改变相等元素的相对位置。 时间复杂度:排序算法的时间复杂度通常以 $O(n^2)$ 或 $O(n \log n)$...
图
图图(Graph) 是一种用于表示关系的非线性数据结构,由顶点(节点,Vertices/Nodes)和边(Edges)组成,表示顶点之间的关系。图的概念适用于很多场景,比如社交网络(用户和好友关系)、地图(城市和路线)等。 图的基本概念 顶点(Vertex):图中的基本单位,表示实体或对象。 边(Edge):连接两个顶点的线,表示它们之间的关系或路径。 有向图(Directed Graph):边有方向的图,边表示从一个顶点到另一个顶点的单向关系。 无向图(Undirected Graph):边没有方向的图,边表示顶点之间的双向关系。 加权图(Weighted Graph):每条边上都有一个权重或费用,用于表示顶点之间的距离或成本。 邻接:如果两个顶点之间有直接边相连,则称它们是邻接的。 路径(Path):从一个顶点到另一个顶点的一条顶点序列,其中相邻顶点之间都有边相连。 环(Cycle):从一个顶点出发经过若干边回到该顶点的路径。 连通图(Connected Graph):在无向图中,任何两个顶点之间都可以找到路径的图。 图的存储 邻接矩阵(Adjacency...
并查集
并查集并查集(Disjoint Set Union, DSU)是一种数据结构,用于处理不相交集合(disjoint sets)的合并(union)和查询(find)操作。并查集特别适用于动态连通性问题,例如判断两个元素是否在同一个集合中或合并两个集合。广泛应用在图论算法中,比如 Kruskal 最小生成树算法。 并查集的概念并查集主要支持两个操作: 查找(Find):确定元素所属的集合。通常返回集合的“代表元素”。 合并(Union):将两个集合合并成一个集合。 并查集使用树结构来表示集合,每个集合中的元素都指向一个根节点,根节点代表该集合。为优化效率,通常使用以下两种技术: 路径压缩(Path Compression):在查找操作中,将树的高度降低,使得查找的时间复杂度接近常数。 按秩合并(Union by Rank):在合并操作中,将较小的树合并到较大的树上,避免树变得过于深。 并查集的性质 时间复杂度:使用路径压缩和按秩合并的并查集可以将单次操作的平均时间复杂度优化到几乎为常数,接近 $O(\alpha(n))$ ,其中 $(\alpha)$...
树
树在数据结构中,树(Tree)是一种分层的非线性数据结构,它由节点(node)和边(edge)组成,并且具有以下性质: 树的概念 节点和边:树包含一组节点,通过边连接,节点之间呈现出层级关系。 根节点:树的起始节点称为根节点(root),通常位于树的顶端。 父节点和子节点:每个节点可以连接其他节点,称为子节点(children);连接它们的节点称为父节点(parent)。 叶子节点:没有子节点的节点称为叶子节点(leaf)。 层级:树的每一层从根节点开始,按层级关系排列。 路径:节点之间的路径由节点和边组成,从根节点到某个特定节点的路径是节点之间的唯一路径。 树的性质 唯一根节点:树中只有一个根节点,没有父节点。 节点数量关系:有 ( n ) 个节点的树,边的数量为 ( n - 1...
哈希表
哈希表(Hash Table)是一种用于存储键值对的数据结构,可以通过哈希函数快速地根据键找到对应的值。哈希表的查找、插入和删除操作在平均情况下具有 O(1) 的时间复杂度,非常高效。 1. 哈希表的基本概念哈希表的核心思想是将键通过一个哈希函数(Hash Function)映射到一个哈希表的索引位置上。若两个键映射到同一位置(即出现哈希冲突),则需要解决冲突以保证数据存储的正确性。 哈希表的术语 哈希函数:将键映射到表中某个位置的函数。 哈希冲突:两个不同的键被映射到同一个位置。 装载因子:表中已填充元素的数量与哈希表大小的比值。较高的装载因子会增加冲突发生的可能性。 2. 哈希表的实现方式哈希表的常用实现方式主要有两种: 开放寻址法:在发生冲突时,通过寻找其他空闲位置来存储元素。常见的开放寻址方法包括线性探测、二次探测和双重哈希。 链地址法(拉链法):在每个哈希表位置存储一个链表,在发生冲突时将新元素插入到链表中。 3. 哈希表的 C++ 实现使用链地址法(拉链法)的 C++...
栈与队列
1. 栈的基本概念与操作栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,最后插入的元素最先被删除。 栈的基本操作 初始化:创建一个空栈。 入栈(Push):将一个元素压入栈顶。 出栈(Pop):从栈顶删除一个元素。 取栈顶元素(Top):获取栈顶元素的值,但不删除它。 判断是否为空:检查栈是否为空。 2. 队列的基本概念与操作队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构,最先插入的元素最先被删除。 队列的基本操作 初始化:创建一个空队列。 入队(Enqueue):将一个元素加入到队尾。 出队(Dequeue):从队头删除一个元素。 取队头元素(Front):获取队头元素的值,但不删除它。 判断是否为空:检查队列是否为空。 3. 栈的顺序存储结构栈的顺序存储结构通常使用数组实现,栈顶指针 top 用于指向栈顶元素。 栈的顺序存储结构的 C++...
线性表
线性表线性表是一种数据结构,表示由同一类型的元素按顺序排列的有限集合。线性表中的元素有顺序关系,可以通过顺序号访问。它是最常用的结构之一,常用于实现数据的顺序存储和查找操作。 线性表的定义一个线性表 $( L )$ 可以定义为一个具有相同类型的元素集合,其中第一个元素为 $( a_1 )$,第二个元素为 $( a_2 )$,依次排列,直到第 $( n )$ 个元素 $( a_n )$。线性表的长度是元素的个数,当长度为 0 时,称其为空表。 在数学上可以表示为:$[ L = { a_1, a_2, \dots, a_n }...
CCSP2024 赛后回忆
CCSP2024 赛后回忆这次是在浙江金华的浙江师范大学,虽然说这里可能有一点点偏僻,但是店铺什么的基本都有,奶茶店,肯德基什么的甚至开在了校内。 这应该是我大学最后一次参加国家级的赛事了吧。 题目I/O 任务调度队列按来的时间排个序,奇数放第一个队列,偶数放第二个队列,保证每个任务等待的时间最小就可以了,签到题。 12345678910111213141516171819202122232425262728293031323334353637#include<bits/stdc++.h>using namespace std;const int mxlen = 1e3+5;int t[mxlen];int n;int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T = 1; while(T--){ cin>>n; for(int i=1;i<=n;i++){ ...
HDU 4870 概率DP
HDU 4870 概率DPProblem Link 题意新账号打rank,rank从0开始,打到1000分结束。每场rank增加50的概率为p,否则rank-100。新人用两个信号去打,每次用rank值低的账号,问任意一个账号达到rank1000分,新人要打的期望场数。 解答参考博客 将分数离散为赢了加1分,输了减2分。用dp[i]表示从i-1分到i分需要打的期望场数。 每次比赛有两种情况,一是p概率赢了加1分,二是(1-p)概率输了减2分。 dp[i]=1*p+(1-p)(1+dp[i-2]+dp[i-1]+dp[i]) 期望等于所有情况乘以概率的和。 一场就赢了,则是1*p 一场输了,则需要(1+dp[i-2]+dp[i-1]+dp[i])场才能赢回来。其中1是输了这场,然后从i-3打到i-2,从i-2打到i-1,从i-1打到i分。 化简得 dp[i]=(1+(1-p)*(dp[i-2]+dp[i-1]))/p dp[1] = 1/p, dp[2] =...
HDU 1024 M子段和最大
M子段和最大问题Problem Link Given an array and divide into m sequences. One sequences at least has one number and the sequences can’t contain the number with same index. And the index of the numbers in one sequence should be continuous. Notice that we don’t have to use all the numbers. N between 1 to 1e6. SOLUTIONDynamic programming. Let d[i][j] denote the maximum sum of the current array that is divided into i segments and the last segment ends with the jth number. When comes to the jth number,...
HDU 1029 寻找数列主元素
寻找数列主元素Problem link Finding a integer that appears at least (N+1)/2 times in the array. 摩尔投票法The Boyer-Moore Voting Algorithm (Moore’s Voting Algorithm) is a highly efficient method to find the majority element in a sequence (an element that appears more than half the time). It operates in O(n) time and uses O(1) space. Key Idea:The algorithm works by maintaining a candidate for the majority element and a counter to track its occurrences. It leverages a “pairing” or “cancellation” mechanism...
HDU 1465 (错位排列问题)
Derangement Problemproblem link Problem DescriptionYou have n letters, each with a different recipient. However, all the letters are delivered to the wrong recipients, meaning no one receives the letter intended for them. You need to determine how many possible ways this can happen. This problem can be simplified to a case where you have an array of numbers from 1 to n. For each position in the array(starting from index 1), the number in that position is different from its index. The goal is...