自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 力扣 21.合并两个有序链表

思路:因为题目示例中没有头结点,创建头指针确定头结点,创建尾指针处理比较后剩余的单一链表,分别遍历两个链表,并用循环逐一比较。

2026-04-04 17:48:02 8

原创 力扣 LCR 084.全排列||

next_permutation,可对数据进行全排列,调用这个函数,可获取下一组排列值,数据全部排列完成后返回false。利用C++标准库中的vector容器和全排列函数next_permutation很方便。遍历排序前先sort快排成有序。

2026-04-04 17:47:50 154

原创 数据结构|链表 刷题

快指针走到环入口需要走m的距离,而慢指针从相遇点出发,因为m+n=c×(y−2x),所以慢指针走m的距离后也会到达环入口(因为m的距离和相遇点到环入口的距离n的关系满足上述等式)思路:两个快慢指针p q ,求出相遇点,然后q从头出发,p从相遇点出发,同频,p q一定会在入环点再次相遇。数学证明:相遇时,慢指针 p走了m+n+c*x(x为圈数),快指针q走了m+n+c*y(y圈)因为快指针速度为慢指针2倍,得到等式2*(m+n+c*x)=m+n+c*y。化简得到m=c*(y-2x)-n。

2026-04-03 12:56:14 271

原创 数据结构|链表 刷题

想要通过函数的某个参数带出某个链表结点的地址,可借助指针的指针或者引用的方式达成。要有交点肯定成Y字型,不可能交叉,因为链表只能有一个前驱一个后继。

2026-04-03 12:56:00 96

原创 数据结构——编程实现中缀表达式转成后缀表达式

计算机运算过程:计算机逐个遍历,直到遍历到运算符,遍历到运算符后将该运算符的前两个操作数(双目运算符)进行运算。3 4 2 *+2 1 1 +/ -5+下一步为3 8 + 2 2 / - 5 +举例:3+4*2-2/(1+1)+5=3+8-1+5=15。转成后缀表达式为:3 4 2 *+2 1 1 +/ -5+后缀表达式:运算符在操作数的后面 例如3 4+,3 4*中缀表达式:运算符在操作数中间 例如3+4,3*4。中缀表达式 :3+4*2-2/(1+1)+5。把运算符放在对应括号的后面。

2026-04-02 21:21:57 40

原创 软件开发通用工程性问题

做什么: 认证身份(JWT/OAuth2/Session/mTLS),鉴权权限(RBAC/ABAC/策略)。- 产出: 测试用例与覆盖率、流水线、/health 与 /metrics、发布策略(蓝绿/金丝雀)。- 认证与鉴权: OAuth2/OIDC、JWT/Session、RBAC/ABAC、CSRF/CORS。- 产出: 配置分层(dev/stage/prod)、DI 容器、配置中心/环境变量规范。- 部署与运维: CI/CD、容器/Docker、K8s、滚动发布/回滚、健康检查。

2026-04-02 21:21:48 177

原创 数据结构|基数排序

一、基数排序基数排序是一种非比较型整数排序算法,也称桶排序,它的基本思想是通过对数据的每一位进行排序,低位优先,从最低位到最高位依次进行进桶出桶操作,循环count次(count为最大值的位数),最终实现整个数据序列的有序排列。桶排序不能处理负数。1.算法思想算法原理基数排序是基于桶排序的思想,将整数按位数切割成不同的数字,然后按每个位数分别进行排序。对于每个位数,使用稳定的排序算法(如计数排序)将元素分配到不同的桶中,然后再按顺序收集桶中的元素。

2026-04-01 19:03:12 30

原创 数据结构|排序算法(三)归并排序

三、归并排序1.算法思想归并排序的基本思想是将一个数组分成两个子数组,对每个子数组进行排序,然后将排序好的子数组合并成一个排序好的数组。这个过程是递归进行的,直到子数组的长度为 1,此时子数组已经是有序的。1.分解:将待排序的数组不断地分成两半,直到每个子数组只有一个元素。可以使用递归实现这一步骤。2.合并:将两个已经排序好的子数组合并成一个排序好的数组。在合并过程中,比较两个子数组的元素,将较小的元素依次放入一个临时数组中,直到其中一个子数组的元素全部被放入临时数组。

2026-04-01 19:03:03 57

原创 数据结构|排序算法(三)堆排序

根是最大的,交换后则视作有序。

2026-03-31 15:30:17 174

原创 数据结构|排序算法(三)选择排序

在每一轮迭代中,从未排序部分中选择最小(或最大)的元素,将其与未排序部分的第一个元素交换位置,从而将该元素添加到已排序部分的末尾。此时,前两个位置的元素是有序的,已排序部分包含两个元素,未排序部分包含剩余的元素。从整个序列中选择最小的元素,将其与第一个位置的元素交换。此时,第一个位置的元素就是整个序列中最小的元素,已排序部分包含这一个元素,未排序部分包含剩余的元素。重复上述步骤,每次都从未排序部分中选择最小的元素,并将其与未排序部分的第一个位置的元素交换,直到未排序部分只剩下一个元素。

2026-03-31 15:30:05 29

原创 数据结构|排序算法(二) 冒泡排序

三、冒泡排序1.算法思想基本思想是:相邻两两比较,大的往后排比较与交换:从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,就将它们交换位置。这样,每一次比较和交换都会将当前未排序部分的最大元素 “浮” 到最后面。多次遍历:对数组进行多次遍历,每一次遍历都会将未排序部分的最大元素放到合适的位置上,直到整个数组都被排序。2.代码实现。

2026-03-30 19:04:42 147

原创 数据结构|排序算法(二) 希尔排序

加快元素移动速度:希尔排序将原始数据分成多个子序列,每个子序列的元素间隔较大。随着间隔逐渐缩小,子序列的长度逐渐增加,而之前已经排好序的子序列能为后续更大规模的排序提供一定的有序基础,充分利用了数据的局部有序性,提高排序效率。随着排序的进行,逐渐减小子序列的元素间隔,直到间隔为 1,此时整个序列基本有序,再进行一次普通的插入排序即可完成排序。希尔排序通过间隔式排序,使数组在初始阶段就接近有序状态,当间隔逐渐减小时,数组已经基本有序,此时再进行插入排序,就可以避免最坏情况的发生,其平均时间复杂度介于O(n)

2026-03-30 19:04:28 862

原创 数据结构|排序算法(二)插入排序

一、插入排序1.算法 思想插入排序(Insertion Sort)是一种简单的排序算法,其基本思想是:将待排序的元素插入到已经有序的序列中,从而逐步构建有序序列。具体过程如下:把待排序的数组分为已排序和未排序两部分。初始时,已排序部分只有第一个元素,即数组的第一个元素被认为是已经有序的。从第二个元素开始,也就是未排序部分的第一个元素,将其与已排序部分的元素从后往前依次比较(因为从后往前越来越有序,则越快)。

2026-03-29 17:51:12 186

原创 Linux|fork命令及其使用的写时拷贝技术

例如,当多次调用printf输出少量数据时,这些数据会先在缓冲区中积累,直到缓冲区满或者遇到特定的条件(如换行符\n),才会将缓冲区中的内容一次性输出。在父进程中,返回值是子进程的进程 ID;简单来说:fork是把已有的进程复制一份,把对应父进程的PCB也复制了一份,然后申请一个PID,子进程,子进程的PID=父进程的PID+1;分配新的进程控制块:内核为新进程分配一个新的进程控制块(PCB),用于存储进程的相关信息,如进程 ID、状态、寄存器值、内存指针等。同时,内核为子进程分配一个唯一的进程 ID。

2026-03-29 17:50:17 170

原创 C++|向函数传递对象

在 C++ 里,对象作为函数的参数和返回值,有值传递、指针传递和引用传递这三种传递方式,下面为你详细介绍。

2026-03-27 13:52:26 30

原创 C++|对象的拷贝构造和赋值

默认拷贝构造函数会逐个成员进行复制,也就是浅拷贝,默认的完成分内的事情(1.为每个成员变量分配内存,2.每个成员变量赋值),当类包含动态分配的资源(像指针)时,浅拷贝可能会引发问题,这时你就需要自己定义拷贝构造函数来进行深拷贝。如果一个构造函数的第一个参数是类本身的引用,且没有其它参数(或者其它的参数都有默认值),则该构造函数为拷贝构造函数。第一个参数必须是类本身的对象的const 引用.可以有其它的参数,但其它参数必须有默认值,注意一般都只有一个参数.●拷贝构造函数 (如果没有,会出现浅拷贝)

2026-03-27 13:52:15 193

原创 位运算的应用

负数,存放补码,即绝对值取反+1,例如-1:绝对值为1=0000 0001->1111 1110->1111 1111。构造k个1,x&((1<<k)-1);解释下为什么要-1,类比十进制下1000-1=999,二进制下1000-1=111。1和其他数字(1位)| 时,该数字变成1;0和其他数字(1位)| 时,该数字不变。1和其他数字(1位)&时,该数字不变;0和其他数字(1位)&时,该数字变成0。1和其他数字(1位)^时,该数字取反;0和其他数字(1位)^时,该数字不变。左移一位再或1(x<<1)|1。

2026-03-26 19:00:16 139

原创 数据结构——编程实现中缀表达式转成后缀表达式

计算机运算过程:计算机逐个遍历,直到遍历到运算符,遍历到运算符后将该运算符的前两个操作数(双目运算符)进行运算。3 4 2 *+2 1 1 +/ -5+下一步为3 8 + 2 2 / - 5 +举例:3+4*2-2/(1+1)+5=3+8-1+5=15。转成后缀表达式为:3 4 2 *+2 1 1 +/ -5+后缀表达式:运算符在操作数的后面 例如3 4+,3 4*中缀表达式:运算符在操作数中间 例如3+4,3*4。中缀表达式 :3+4*2-2/(1+1)+5。把运算符放在对应括号的后面。

2026-03-26 18:57:26 277

原创 C++|类和对象

类是可以自己定义的一种自定义数据类型,是对某一类对象的抽象,对象是类的一个实例。

2026-03-24 16:14:06 198

原创 力扣刷题|链表面试题 02.02. 返回倒数第 k 个节点

题目:实现一种算法,找出单向链表中倒数第 k 个节点。

2026-03-24 16:13:58 445

原创 软件开发通用工程性问题

做什么: 认证身份(JWT/OAuth2/Session/mTLS),鉴权权限(RBAC/ABAC/策略)。- 产出: 测试用例与覆盖率、流水线、/health 与 /metrics、发布策略(蓝绿/金丝雀)。- 认证与鉴权: OAuth2/OIDC、JWT/Session、RBAC/ABAC、CSRF/CORS。- 产出: 配置分层(dev/stage/prod)、DI 容器、配置中心/环境变量规范。- 部署与运维: CI/CD、容器/Docker、K8s、滚动发布/回滚、健康检查。

2026-03-23 19:03:31 340

原创 C++|列表初始化

例如,当使用auto推断一个内置类型时,使用{}初始化可能会被视为创建一个包含单个元素的初始化列表,而不是将该元素的值赋给变量。窄化转换(收缩转换):窄化(收缩)转换是指将一个较大范围的数据类型转换为较小范围的数据类型,而可能导致数据丢失或精度降低的转换。{}空初始化列表时使用默认值进行初始化,例如int型默认为0,double型默认为0.0,指针默认为nullptr(空指针)。列表初始化即使用{}初始化,可在编译时自动识别数据窄化转换(收缩转换)。特别地,在使用auto关键字时使用=初始化更好。

2026-03-23 19:02:12 154

原创 C++|空指针nullptr

它是一种特殊的空引用,与 C 和 C++ 中的 NULL 有相似的概念,但在使用和语义上有一些区别。与其他值区分开来:NULL 作为一种特殊的值,与其他正常的数值、字符或对象值区分开来,使得程序能够明确地区分有效数据和无效数据,便于进行各种逻辑判断和处理。例如,在数据库查询中,NULL 表示字段值的缺失,与空字符串或 0 等其他值有不同的语义,有助于正确地处理和分析数据。在 Python 中,None 是一个特殊的对象,用于表示空值或缺少值的概念,类似于其他语言中的 NULL 或 null。

2026-03-22 22:07:30 26

原创 C++|范围for

变量:定义一个变量,用于在每次循环迭代中存储序列中的一个元素。该变量的类型应该与序列中元素的类型兼容,也可以使用auto关键字让编译器 自动推导元素类型。序列:表示要遍历的序列,可以是{}初始化列表、数组、vector、list等容器,也可以是返回迭代器对的对象。C++11新引入的for语句,可遍历stl容器。2.遍历string。

2026-03-22 22:05:45 102

原创 C++|对象数组和对象指针

因为类 本质上也是一种数据类型,所以定义对象数组、使用对象数组的方法与基本数据类型相似,系统为对象数组分配适合的内存空间,以存放数组中的每个对象,同时还为每个对象自动调用匹配的构造函数完成数组内每个对象的初始化工作,但数组结束时会自动调用每个对象的析构函数。在 C++ 中,对象指针的定义和使用与普通指针类似,只是它指向的是一个类的对象。用对象指针访问对象成员函数的格式为:对象指针名->成员函数(实参列表);用对象指针访问对象数据成员的格式为:对象指针名->数据成员。类名 *对象指针 = &对象;

2026-03-19 17:35:12 522

原创 C++|this指针

当对一个对象调用成员函数时,编译程序先将对象的地址赋予this指针,然后调用成员函数。每次成员函数存取数据成员时,C++编译器将根据 this 指针所指向的对象来确定应该引用哪一个对象的数据成员。在构造函数 Point(int x, int y) 中,参数名和成员变量名相同,为了区分它们,使用 this->x 和 this->y 来明确表示访问的是对象的成员变量。在 printInfo() 函数中,使用 this->x 和 this->y 来访问调用该函数的对象的成员变量。

2026-03-19 17:35:04 98

原创 数据结构|排序算法(一)快速排序及其优化

3.从 right 指针开始,向左移动 right 指针,找到第一个小于基准值的元素,(从后往前找,找比基准小的数字,往前挪),然后从 left 指针开始,向右移动 left 指针,找到第一个大于基准值的元素(从前往后找,找比基准大的数字,往后挪)。此时,将基准值与 left 指针所指向的元素交换位置,这样基准值就处于正确的排序位置上,并且其左边的元素都小于它,右边的元素都大于它。2.从序列的两端开始,设置两个指针,一个指向序列的起始位置(left),一个指向序列的结束位置(right)。

2026-03-17 12:51:02 170

原创 Linux|fork命令及其使用的写时拷贝技术

在父进程中,返回值是子进程的进程 ID;复制进程地址空间:将父进程的地址空间(包括代码段、数据段、堆和栈等)复制到新进程的地址空间中。简单来说:fork是把已有的进程复制一份,把对应父进程的PCB也复制了一份,然后申请一个PID,子进程,子进程的PID=父进程的PID+1;分配新的进程控制块:内核为新进程分配一个新的进程控制块(PCB),用于存储进程的相关信息,如进程 ID、状态、寄存器值、内存指针等。复制文件描述符表:父进程打开的文件描述符在子进程中也会被复制,使得子进程可以访问相同的文件资源。

2026-03-17 12:47:44 36

原创 2048小游戏源代码

bool MergeRight(int arr[ROW][COL]) {//往右合并和移动数字。bool MergeLeft(int arr[ROW][COL]) {//往左合并和移动数字。bool MergeDown(int arr[ROW][COL]) {//往下合并和移动数字。outtextxy(230, 0, _T("你赢了"));while (peekmessage(&m, EX_KEY)) {//按键消息。

2026-03-16 20:37:40 468

原创 C语言五子棋小游戏代码

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行#include <graphics.h> // 引用图形库头文件#include <conio.h>#define NUM 15//棋盘大小#define WIN_NUM 5//五子棋int pieceArr[NUM][NUM] = { 0 };//记录15*15个棋盘的棋子情况,0表示没有棋子,1表示黑子,2表示白子/*C标准库,不能画图* 15*15条边,* 窗口大小 15*40=600(x)

2026-03-16 20:26:57 599

原创 利用C进行数字的顺序输出和逆序输出

2025-10-22 18:16:36 108

原创 Python下载实战:从基础到高阶的30个技巧

【代码】Python下载实战:从基础到高阶的30个技巧。

2025-10-22 18:12:51 190

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除