- 博客(80)
- 收藏
- 关注
原创 面试之c++的重写与重载
在面向对象编程中,重写(Override)和重载(Overload)是两个重要的概念,它们都涉及到方法的定义和调用,但应用场景和目的有所不同。下面分别介绍这两个概念及其在C++中的应用。重写是指子类重新定义父类中的虚函数(virtual function)。通过重写,子类可以根据自己的需求提供不同的实现,从而实现多态性。2. 重载(Overload)重载是指在一个类中定义多个同名函数,但这些函数的参数列表不同(参数个数、类型或顺序不同)。重载的目的是为了提供更灵活的接口,使同一个函数名可以处理不同类
2024-10-09 16:13:05 364
原创 二叉树的迭代遍历
二叉树的迭代遍历指的是使用循环(迭代)的方法,而不是递归,来遍历二叉树的节点。迭代遍历通常需要使用辅助数据结构(如栈或队列)来帮助控制遍历的顺序。
2024-10-01 06:30:00 197
原创 二叉树的递归遍历
确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
2024-09-30 18:30:00 226
原创 字符串逆序
整个程序的时间复杂度是 ( O(n) ),其中 ( n ) 是输入字符串的长度。这是因为每个字符都被处理了两次(一次递归调用,一次打印),但这两个操作都是线性的。总的来说,这个程序的时间复杂度是 ( O(n) ),空间复杂度也是 ( O(n) ),其中 ( n ) 是输入字符串的长度。这段程序的时间复杂度主要取决于输入字符串的长度,即输入的字符数。
2024-09-29 11:24:33 728
原创 openssl-AES-128-CTR加解密结构体
清理操作exit执行清理操作,而abort不会。退出状态exit允许你指定一个退出状态码,而abort通常不提供这个功能。调试abort可能会生成核心转储文件,有助于调试,而exit不会。使用场景exit用于正常的程序退出或错误退出,而abort用于遇到严重错误,需要立即终止程序的情况。buffer:指向包含序列化数据的字节缓冲区的指针。data:指向info结构体的指针,该结构体将存储反序列化的数据。
2024-09-21 08:00:00 939
原创 openssl-AES-128-CTR加解密char型数组分析
本文章通过对一个unsigned char*类型的数据做简单的加解密操作来学习如何使用openssl库函数。openssl为3.0.0,对此前版本的很多函数都不兼容。运行脚本输出的数据与加密前的数据一样,当然这只是加密字符串可以如此简单,但是如果数据是结构体呢?这段代码是一个使用 OpenSSL 库进行 AES-128-CTR 模式加密和解密的 C 程序。下面是代码的详细解析:包含头文件:错误处理函数:主函数 :密钥和初始化向量:生成密钥和 IV:定义数据:加密和解密上下文:加密过程:解密过程:
2024-09-20 08:00:00 1296
原创 读写文件 -
从char型数组中读取数据,写入源文件source.txt中,再将数据从source.txt中读取出来写入destination.txt,来模拟文件传输过程的读写工作。
2024-09-16 08:00:00 245
原创 文件存储数据
设计一个小程序实现功能,将这个结构体的数据,保存在文件中如果是想将数据以文本格式保存在txt文件中,则使用fprintf()函数如果是想将数据以二进制保存在bin文件中,则使用fwrite()函数。
2024-09-15 08:00:00 752
原创 shell脚本语法
系统变量是操作系统用来存储配置信息的变量,它们可以控制操作系统的行为和程序的运行环境。系统变量的种类和内容取决于操作系统的类型和版本。:这些变量为程序提供运行时所需的信息,如文件路径、系统配置、用户偏好等。PATHHOMETEMPTMPDIR:这些变量定义了系统的基本配置,如系统启动参数、硬件配置、网络设置等。HOSTNAMESHELLHISTSIZE:这些变量存储了用户的个人设置,如桌面环境、主题、语言偏好等。:这些变量与系统的安全设置和用户权限有关。UIDEUID。
2024-09-14 08:00:00 2006
原创 memcpy
它不检查源和目标内存区域是否重叠,如果重叠,复制的结果可能是未定义的。如果需要处理重叠的内存区域,应使用。是 C 语言标准库中的一个函数,用于从源内存地址复制指定长度的字节到目标内存地址。输出结果将显示源字符串和目标字符串的内容。指向的内存地址开始复制。
2024-09-13 10:07:22 199
原创 shell脚本控制语句
在Shell脚本中,if语句用于基于条件执行不同的代码块。以下是一个具体的示例,展示了如何使用if或者使用[[ ]],它提供了更多的灵活性和更强的字符串比较功能:使用[[ ]]==!=~&&||[[ ]]提供了更多的功能和更好的灵活性,是Bash脚本中推荐使用的条件测试方式。而[]则更传统,兼容性更好,但在使用时需要更加小心。
2024-09-12 08:00:00 865
原创 数据读写函数
在编程和网络通信中,write, read, recv, 和 send是用于数据传输的函数,它们通常在不同的编程语言和库中用于处理输入和输出。这些函数在功能上有一定的重叠。recv和send特定于网络编程,位于socket.h库中write和read通常用于文件 I/O 或低级的网络通信,位于unistd.h库中在一般情况下,以下函数都用于阻塞模式。
2024-09-05 09:59:28 637
原创 生成密码c
目前需要实现生成8-12位密码,密码要求至少包含一位数字,一位大写字母,一位小写字母,一位特殊字符。特殊字符仅包含(“@”,“!”,“_”)
2024-09-04 08:00:00 1000
原创 bzero和memset函数
bzero() 函数是一个在 C 语言中用于将内存块的前 n 个字节清零的函数。它的原型定义在 string.h 头文件中,其函数原型为 void bzero(void *s, int n);,其中 s 是指向要清零的内存区域的指针,n 是需要清零的字节数。这个函数是非标准的,意味着它并不在 ANSI C 标准中定义,但它在一些系统和编译器中是可用的,比如 Linux 的 GCC。bzero() 与 memset() 函数在功能上是等价的,都可以用来将内存块的前 n 个字节清零。
2024-09-02 08:00:00 334
原创 使用mysql保存密码
mysql_stmt_close 是一个函数,用于关闭之前通过 mysql_stmt_init 创建的 MYSQL_STMT 语句对象。mysql_stmt_execute 函数用于执行一个已经通过 mysql_stmt_prepare 预编译的 MYSQL_STMT 语句对象。mysql_stmt_bind_param 函数用于在执行预编译的 SQL 语句之前,将应用程序中的数据绑定到 SQL 语句中的参数位置上。
2024-09-01 08:00:00 628
原创 生成密码c++
目前需要实现生成8位密码,密码要求至少包含一位数字,一位大写字母,一位小写字母,一位特殊字符。如果用户第一次使用还没有输入密码,密码则为系统随机生成。用户输入密码,符合规则则将默认密码覆盖掉。
2024-08-31 08:00:00 620
原创 ZeroMQ三种模型
如果有多个PULL端同时连接到PUSH端,则PUSH端会在内部做一个负载均衡,采用平均分配的算法,将所有消息均衡发布到PULL端上。Subscribe端只能接收,不能反馈,且在Subscribe端消费速度慢于Publish端的情况下,会在Subscribe端堆积数据。在这种模型中,数据可以双向流动。核心思想是将消息的发送者(发布者)和消息的接收者(订阅者)解耦,使它们无需直接联系,这种模式通常用于需要一对多通信的场景。这种模型的特点是数据传输是单向的,即数据只能从PUSH端流向PULL端,而不能反向流动。
2024-08-29 08:00:00 645
原创 ZMQ管道模型
在管道两边,可以有n个生产者,m个消费者,生产者的消息会以先进先出的顺序经过管道到达消费者,管道发给m个消费者的消息是负载均衡的。
2024-08-26 08:00:00 267
原创 ZMQ发布订阅模型
在 ZeroMQ 的发布-订阅模式中,订阅者(subscriber)套接字需要订阅一个或多个特定的消息主题,以便只接收与这些主题匹配的消息。这是订阅过滤器的字符串。在这个例子中,传递了一个空字符串,这意味着订阅者将订阅所有可用的消息。如果这里指定了一个非空字符串,那么订阅者只会接收与该字符串匹配的消息。在发布订阅模型中,发布者只负责发布消息,不在乎订阅者收没收到,而订阅者只负责接受自己想要的消息,也不在乎发布者发布的是什么消息。在发布订阅模型中,发布者只负责发布消息,不在乎订阅者收没收到。
2024-08-24 08:00:00 478
原创 scoket通信 -- 重要的sockaddr
sockaddr是存储socket结构信息的结构体,它具有通用性。sockaddr在后来ipv4出现之后进化成了sockaddr_in,其在结构体上已与sockaddr不同,而在ipv4用完之后,ipv6出现并产生了ipv6的衍生版本sockaddr_in6。然而为了兼容性,我们无论在使用ipv4还是ipv6进行通信时,都要将结构体强转为sockaddr类型,详见如下。需要注意的是结构体in_addr的结构这个sockaddr数据结构在服务端bind时,accept时,客户端connect时都有
2024-08-13 09:11:50 366
原创 linux -- Git基础使用
简单说来Git是一个开源的分布式版本控制系统,那么什么是分布式呢,就是每个开发者拥有完整的本地仓库副本,包括所有历史记录和分支,可以独立工作,并通过合并来同步变更。Git在合并、分支、切换等操作上非常快速。通过SHA-1哈希算法保护代码和历史记录的完整性,确保代码不会在传输过程中损坏。Git支持快速创建和合并分支,方便开发者进行实验和并行开发。由于是分布式的,Git可以在没有网络连接的情况下进行大部分操作。正常来说,下载速度很慢,所以我也没有去下如果可以查出版本的话就说明安装成功了当你修改文件但是未
2024-08-13 08:00:00 1263
原创 socket回显服务器练习
什么是回显服务器(echo server)呢?回显服务器接收客户端发送的任何数据,并将这些数据原封不动地发送回客户端。回显服务器在连接成功的基础上只需要知道如何在客户端将收到的信息打印输出到控制台即可。我接下来会使用两种方法来输出,一种是printf(),另一种是fputs(),详见客户端信息传输部分。
2024-08-12 18:01:13 395
原创 安装vscode -- linux
相信很多人在刚开始使用linux时,不知道怎么安装vscode来辅助我们编程,那么我将在此记录我所用的安装vscode的方法。
2024-08-05 08:00:00 1819
原创 leetcode -- 18.四数之和
使用双指针可以将四重循环的O(n^4)的时间复杂度降到。整体思路在避免出现重复四元组的情况下,找出所有四元组。两层for循环加上while循环,综合O(n^3)。
2024-07-29 08:00:00 321
原创 leetcode454.四数之和II
最简单易想的就是O(n^4)时间复杂度的暴力四重循环算法,本题返回一个整数表示有多少个元组符合要求,也没有任何去重的要求。本题可以分两部分,先计算nums1和nums2的和,然后在算nums3和nums4的和。将4数之和降维为两数之和,时间复杂度也会相比暴力算法大幅下。这是一个暴力四重循环算法,显然时间复杂度就是O(n^4)两个双层循环,总体时间复杂度为O(n^2)
2024-07-27 08:00:00 239
原创 leetcode -- 15.三数之和
第三种,元素数值过小,如果nums[i] + nums[n - 2] + nums[n - 1] < 0,那么nums[i]就太小了,需要遍历下一个更大的nums[i],continue继续遍历即可。设想nums = [-1,-1,2],那么nums[0] == nums[1],continue,是否会漏掉[-1,-1,2]这个正确答案呢。设想nums = [-1,-1,0,1,2],如果nums[0]满足要求[-1,-0,1],那么nums[1]也满足要求,故而需要去掉一个。
2024-07-26 08:00:00 1153
原创 leetcode热题100-动态规划(dynamic programing)-杨辉三角
在爬楼梯一题中使用一维数组即可,而本题则需要二维数组,所以这也是我为什么说dp数组的含义是第i行第j列的数组元素是什么的原因。仅靠dp[i] [j]=dp[i-1][j-1]+dp[i-1][j]这个递推公式,无法无法推出旁边的1,所。输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]以这些1需要手动赋值,但它们是有规律的,皆是位于每一行的第一位最后一位。本题dp[i][j]的含义就是第i行第j列的元素数值是多少。第一步,确定dp[i][j]数组的含义。
2024-07-25 08:00:00 543
原创 leetcode热题100-动态规划(Dynamic Programming)-爬楼梯
还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。从递推公式dp[i] = dp[i - 1] + dp[i - 2];所以dp[i] = dp[i - 1] + dp[i - 2]。那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!dp[i]: 爬到第i层楼梯,有dp[i]种方法。解释:有两种方法可以爬到楼顶。
2024-07-24 08:00:00 453
原创 leetcode热题100-栈-有效的括号
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了(右括号没有找到对应的左括号 )第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符(字符串元素不匹配)第一种情况:最后栈内还有左括号,说明字符串无效说明左括号多了。将所有的左括号以右括号的形式入栈(后续容易判断)如果匹配到右括号就出栈。
2024-07-24 08:00:00 340
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人