自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 PAT 1021-1030

【代码】PAT 1021-1030。

2023-02-03 18:21:28 157 1

原创 PAT 1011----1020

【代码】PAT 1011----1020。

2023-01-30 02:24:19 182

原创 PAT 1001--1010

PAT甲级题库1001----1010实践

2023-01-27 16:21:53 167

原创 leetcode清晨的算法修炼课——数组(三)滑动窗口的使用

什么是数组当中的滑动窗口,故名思意,即在一个连续数组中通过两个指针(数组下标索引)分别作为窗口的起始位置和结束位置,形成一个起始位置和结束位置可以改变的窗口,这个窗口内的元素其实也就是数组中连续的子序列。一般题目中要求寻找某种符合要求的子序列时,可以考虑使用滑动窗口的思想。注意:滑动窗口也是在一个数组中使用两个指针进行标识,读者可以在看完本篇文章内容以后同我前面介绍的双指针技巧加以区分,这边先附上链接:leetcode刷题技巧(一):双指针接下来通过一个例子来具体介绍一下滑动窗口的用法:leetcod

2022-06-19 23:15:53 149

原创 leetcode清晨的算法修炼课——数组(二)双指针的应用

双指针是应用在有序表中的一个技巧,分为快慢指针与对撞指针,当用数组这种数据结构处理的问题时,某些情况我们可以考虑到双指针。不过正如我前面所说,双指针并不是专属于数组的一种解题技巧,因此只用数组这一数据结构来说明双指针可能并不能很好的形成对双指针的理解,因此我重新写了一篇文章,并不拘泥于数组这一数据结构。里面专门介绍并整体总结了双指针的使用技巧,要求读者在数据结构方面已经有了一定的基础:熟悉各种数组,链表的操作即可。读者可以在我所举的例子以及我的解读方面体会双指针的妙用。leetcode刷题技巧(一):双指

2022-06-18 23:05:07 77

原创 leetcode刷题技巧(一):双指针

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。1,快慢指针扫描过程中,一般有两种情况1)快指针进行逐个扫描,慢指针依赖快指针进行更新,慢指针则作为一个记录变量辅助完成对快指针扫描到的元素的操作,或者说慢指针只是依赖于快指针单纯进行更新,等到循环的最后才会使用到更新完毕的慢指针的值。(即:快指针与慢指针之间有一个核心的关系,这个关系决定了慢指针如何更新)例如leetcode第206题:反转链表;l

2022-06-16 23:27:49 528 2

原创 leetcode清晨的算法修炼课——数组(一)彻底掌握二分法

使用数组之前须知数组的存储方式为顺序存储方式,这就需要我们关注以下几点:1,一维数组a[n]的数组元素存放位置是一片连续的存储空间。2,二维数组a[m][n]的数组元素存放位置是m片连续的存储空间,因为二维数组可以视为是m个容量为n的一维数组。而该二维数组其实是一个一维数组当中连续存储了m个一维数组的首地址,根据这m个一维数组当中的首地址,即可依次访问这m个一维数组,即访问到所有的数组元素。3,由于数组在内存中连续存储的特性,所有在删除或者增添元素的时候,就难免要移动其他元素的地址,因此数组不便于在多

2022-06-13 17:38:10 94

原创 网络编程(四)TCP IO多路转接服务器编程(select)多线程

一,select多路转接服务器网络编程(三)TCP IO多路转接服务器编程(select)二,select多路转接服务器(多线程)前面介绍的select多路转接服务器已经可以实现处理多个客户端的服务器,为了进一步提高效率,我们还可以将上面的select多路转接服务器改写为多线程的形式。与前面普通的select多路转接服务器相比,要修改为多线程主要是要在主线程的while(1)的循环中做些处理:在select检测完读集合过后,1,如果检查到有监听文件描述符准备就绪,则开一个子线程让其去处理该次的连接

2022-04-01 20:59:02 1781

原创 网络编程(三)TCP IO多路转接服务器编程(select)

一,select知识引入前面已经介绍过了1)单线程的服务器,可以处理单个客户端与服务端的交流;2)多线程的服务器,可以处理多个客户端与服务端的交流。根据前面的知识,我们知道了如果想要处理多个客户端与服务器的交流的话可以使用多线程的技术,而这篇博客就来介绍一下处理多个客户端与服务器的交流的一个新的技术:IO多路复用——select方法。二,select基本概念2.1 select概念理解前先总结一下通信过程(便于后文理解select)1,listen()监听函数过后,服务器的ip与端口就会暴露在

2022-03-30 22:23:04 3094

原创 网络编程(二)TCP多线程服务器编程详解

注:这里多线程编程使用的是c++11标准里面的跨平台方法。前面已经介绍了单线程服务器编程的一个例子,为了实现一个服务器能够并发响应多个客户端的请求,这里引入多线程的方法:将原来的单线程服务器改造成多线程服务器只需要改动下面两个地方1,因为listen()监听函数过后,服务器的ip与端口就会暴露在网络中,网络中连接的各个客户端就可以连接该服务器,而所有的连接请求都会存储在监听文件描述符对应的读缓冲区中,每执行一次accept,就会从该监听文件描述符对应的读缓冲区中读取一个连接,因此,如果是多线程服务器,

2022-03-28 20:12:03 6322

原创 网络编程(一)TCP单进程服务器编程详解

一,单进程处理服务器1,基本概念想要学习socket网络编程的读者一定要首先学好计算机网络的理论知识,包括1)osi网络七层模型与ip四层模型2)套接字含义3)局域网通信过程4)广域网通信过程5)tcp,udp通信协议,在这两个协议中的数据封装,传输过程,传输中可能遇到的问题的处理(差错控制,拥塞控制)6)ip网络层协议,以太网帧协议7)数据的封装以上的知识点是个人觉得学习计算机网络必须要理解透彻的一些知识点,接下来要介绍的socket网络编程便是基于以上知识点学习的。socket网络

2022-03-28 02:04:23 4807

原创 使用vscode在linux平台开发C++程序(2)(包括cmake,gdb)

上一篇博客已经介绍了1,认识并使用vscode2,使用g文章目录5,不用vscode直接使用gdb调试一个多文件C++工程5.1 打断点命令5.2 运行调试过程的命令5.3 与查看变量有关的命令6,在vscode上直接调试一个C++工程与在vscode上使用gdb调试一个C++工程相结合5,不用vscode直接使用gdb调试一个多文件C++工程还是上一篇博客用到的例子,但是为了方便查看更长的调试过程,在main函数中加一个while循环。而且注意,最后编译形成的可执行文件 main_cmake

2022-03-06 20:52:44 1362 1

原创 使用vscode在linux平台开发C++程序(1)(包括cmake,gdb)

写这篇博客主要目的是记录以下几个知识点,接下来一个接一个介绍其概念与用法。1,认识并使用vscode2,使用g++编译运行一个多文件C++工程3,使用cmake编译一个多文件C++工程4,在cscode上面编译运行一个多文件C++工程5,在vscode上面调试一个多文件C++工程6,不用vscode直接使用gdb调试一个多文件C++工程7,在vscode上直接调试一个C++工程与在vscode上使用gdb调试一个C++工程相结合1,认识并使用vscode1)vscod下载,可以进官网下载,

2022-03-06 14:34:25 4001 1

原创 正则表达式

正则表达式(regular expression)描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。MySQL通过REGEXP关键字支持正则表达式进行字符串匹配。java,python也支持正则表达式的匹配应用。这里先贴一下正则表达式的匹配规则,然后在后文对各种规则进行实践。1,^,匹配输入字符串的结束位置,给个例子:SELECT 'ABC' REGEX

2022-03-02 15:23:42 418

原创 C++易错知识点笔记(十四)函数指针

函数指针这个东西用的比较少,但是却是必须知道的一个内容,以前我只是大致了解了一下函数指针,毕竟没有怎么用过,今天别人给我一个题目我竟然没有反应过来,实在是不应该,因此专门写一个博客记录这个知识点。1,函数指针基本概念如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。2,函数指针的定义举个例子int(*p) (in

2022-02-28 20:31:38 476

原创 Mysql数据库基本操作(十五)Mysql优化(2)性能优化

上一篇:Mysql数据库基本操作(十五)Mysql优化(1)性能分析文章目录1,使用trace跟踪sql优化器2,索引优化2.1 准备数据2.2 索引使用注意事项2.2.1 全值索引2.2.2 避免索引失效应用-最左前缀法则2.2.3 索引其他注意事项2.2.4 覆盖索引原则2.2.5 使用or时注意2.2.5 使用like的注意事项2.2.6 有时不该设置索引3,sql优化3.1 优化insert语句3.2 优化order by语句3.3 优化group by语句3.4 优化子查询3.4 limit优

2022-02-23 22:40:04 666

原创 Mysql数据库基本操作(十五)Mysql优化(1)性能分析

在应用的的开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的SQL语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化.一般Mysql的优化分为两步,首先分析Mysql的性能,然后想出对应的方法优化。一,性能分析1.1 查看sQL执行频率MySQL客户端连接成功后,通过show [session|global] status命令可以查看服务器状

2022-02-22 19:43:04 731

原创 Mysql数据库基本操作(十四)日志

文章目录1,错误日志2,二进制日志2.1 binlog日志查询基本操作2.2 补充:日志格式3,查询日志4,慢查询日志在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件。MySQL也不例外。1,错误日志错误日志是MysQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。该日志是默认开启的,默认存放目录为mysql的

2022-02-20 17:05:03 1490

原创 Linux学习(七)进程管理,服务管理

文章目录一,进程管理1.1 显示系统正在执行的进程-ps指令1.2 终止进程 kill 和 killall1.3 pstree 以树形结构直观查看进程信息二,服务管理2.1 service管理指令2.2 查看服务2.3 CentOs后台运行级别2.4 systemctl 管理的服务2.5 防火墙服务学习firewalld. service三,动态监控进程四,动态监控网络一,进程管理1,在linux中,每个执行的程序都称为一个进程。每一个进程都分配一个ID号(pid,进程号)。2,每个进程都可能以两种方

2022-02-19 21:40:26 304

原创 玩转linux时遇到的问题(同步更新)

1,远程登陆阿里云图形化界面(centos8)刚租的阿里云esc服务器默认是没有图像化界面的,即使将运行级别默认调为5,还是不会显示图形化界面,解决方法如下:1,登陆服务器实例2,执行下面命令安装图形化界面软件包yum groupinstall "Server with GUI" -y 3,设置系统启动默认运行级别为图形化界面systemctl set-default graphical4,reboot5,在阿里云控制台使用vnc连接实例2,Errors during downloa

2022-02-19 15:36:25 616

原创 C++新特性(六)多线程(5)async、future、packaged_task、shared_future、promise

一,async函数与future对象的使用(顺便简单引入future)1,async的普遍用法std::async是一个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,它返回一个std::future对象,这个对象是个类模板。什么叫“启动一个异步任务”?就是自动创建一个线程,并开始 执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。下面给出一个使用例子

2022-02-17 15:03:02 735

原创 C++新特性(六)多线程(4)condition_variable(条件变量)、wait、notify_one、notify_all

一,条件变量的作用学过操作系统的同学们应该知道,在进程管理那一章节,为了管理进程互斥进入临界区有了互斥信号量,这和我们线程里互斥访问共享数据思路差不多。但进程管理中同样有进程同步的管理,例如最经典的生产者消费者问题:缓冲区可容纳10个产品,因此生产者生产时必须先确定缓冲区有空位;消费者消费时必须确定缓冲区有产品。对于我们上一篇讲的场景来说——该场景模拟一个简单的游戏服务器,该服务器中有两个线程,一个线程负责往一个共享队列写玩家命令数据;另一个线程负责从这个共享队列中读取玩家命令并执行。共享队列的长度没有限

2022-02-16 17:13:32 2031 4

原创 C++新特性(六)多线程(3)unique_lock类模板

一,unique_lock类模板取代lock_guard1,unique_lock是个类模板,工作中,一般lock_guard(推荐使用); lock_guard取代了mutex的lock()和unlock()2,unique_lock比lock_guard灵活很多;效率上差一点,内存占用多一点。因此,如果我们工作中想要使用unique_lock,一般是考虑到他的灵活性。3,普通的lock_guard使用语句为:lock_guard<mutex> sbguard(my_mutex);而普通

2022-02-16 15:11:41 640

原创 C++新特性(六)多线程(2)线程中互斥量的使用,mutex对象使用,lock_guard类模板,死锁的解决

一,创建多个线程前面学习了怎么使用thread类创建一个线程C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解,在实际应用中,我们可以创建多个线程void TextThread(){ cout << "我是线程" << this_thread::get_id() << endl; /* … */ cout << "线程" << this_thread::get_id

2022-02-15 18:28:41 677

原创 C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解

1,整个程序从main函数开始执行主线程,而我们自己创建的线程,同样是由一个我们自己定义的函数开始执行。2,整个进程是否执行完毕的标志是主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了;此时,一般情况下:如果其他子线程还没有执行完毕,那么这些子线程也会被操作系统强行终止。所以,一般情况下,我们得到一个结论:如果大家想保持子线程的运行状态的话,那么要让主线程一直保持运行,当然这种规定也有例外,以后会讲到。3,头文件#include<thread>4,一个超级简单的多线程例子演

2022-02-10 17:41:01 1503 1

原创 C++新特性(五)智能指针

不同于java的垃圾回收机制,C++需要程序员自己申请资源,使用完资源以后还要记得释放资源,例如new和delete要配套使用;文件打开以后使用完要关闭;数据库连接以后使用完要断开…这都是程序员需要额外注意的点。忘记了资源释放,会造成资源泄露。为了做到智能释放使用完的资源,C++有了智能指针的技术。结合类使用了引用计数的想法,使程序员不用再担心资源释放的问题。(RAII思想)下面先介绍一下RAII思想1,RAII思想众所周知,一个类对象创建会自动调用构造函数,析构会自动调用析构函数。因此我们可以利用此

2022-02-03 20:36:46 1202

原创 C++新特性(四)函数对象包装器function与bind

1,函数对象包装器函数对象包装器的意思是将整个函数包装起来,包装成一个容器,以后要使用该函数的时候只需要调用该容器即可。头文件#include<functional>例子:函数对象包装器支持4种函数的包装,使得函数的表达都成了一个统一的整体。1,普通函数2,匿名函数3,普通成员函数4,仿函数(重载了运算符()的函数)其中1的对象包装已经演示过,而下面的代码演示了全部四种函数的包装。读者可直接通过运行下面代码理解#include<iostream>#includ

2022-02-02 20:12:15 793

原创 C++新特性(三)lambda表达式与匿名函数

lambda表达式就是匿名函数,既然都称呼其为匿名函数了,也就是说它是一个函数!这个函数不用去设置函数名。1,基本语法[捕获列表](参数列表)mutable(可选)异常属性->返回类型{//函数体}//举例://[]挂获列表(参数列表->返回值[](int a.. int b) -> int{//函数体return a + b;}//该例子没有演示捕获列表以及mutable的用法,在后文会介绍。1.1 匿名函数的用法(1)可以看到,因为匿名函数没有名字,所以我

2022-02-02 17:32:52 658

原创 Linux学习(六)查询磁盘情况命令

1,查看设备挂载情况lsblk 或者 lsblk -f2,查看系统整体磁盘使用情况 df-h3,查看指定目录的磁盘占用情况du -h查询指定目录的磁盘占用情况,默认为当前目录-s 指定目录占用大小汇总-h带计量单位-a 含文件--max-depth=1 子目录深度-c 列出明细的同时,增加汇总值例如:查看/etc目录的磁盘占用情况,深度为14,磁盘情况-工作实用指令1)统计/opt文件夹下文件的个数ls -l /opt | grep "^-" |wc -l //注意,这

2022-02-02 14:31:06 3657

原创 Linux学习(五)定时任务调度

一,crond任务调度任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:1,系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等2,个别用户工作:个别用户可能希望执行某些程序,比如对mysql数据库的备份。又比如执行某些自己编写的shell脚本。1,crontab命令-e 编辑crontab定时任务-l 查询crontab任务-r 删除当前用户所有的crontab任务命令入门:设置任务调度文件: /etc/crontab设置个人任务调度。执行crontab -e

2022-02-02 13:23:28 2831

原创 Linux学习(四)组管理和权限管理

1,一个文件对于不同的用户应该有不同的操作权限,linux分别在文件所有者用户,文件所在组用户,其他组用户这三类用户中设置文件的不同权限,实现每一类的权限不同。下面看看这三类的含义:1)文件所有者:默认是创建文件的用户,也可通过命令改变2)文件所在组:默认是创建文件的用户所在的组,也可通过命令改变3)其他组:除去文件所在组的其他组2,查看这三类用户的权限在某个目录中,执行命令`ls -alh`,显示该目录下所有文件的信息,后+文件路径即显示特定目录下的文件信息。注意:下面对于各项字段的讲解以

2022-02-02 11:59:15 1608

原创 数据结构常用算法总结(二)手写八大排序(插入,希尔,简单选择,冒泡,快排,归并,堆排,基数排序)

1,插入排序2,希尔排序3,简单选择排序4,冒泡排序5,快速排序6,归并排序7,堆排序8,还有桶排序,较为简单#include<iostream>#include<vector>using namespace std;//1,插入排序void insertSort(vector<int>&a){ for (int i = 1; i < a.size(); i++) {//插入排序,处理第i个数据 for (int j = i

2022-02-01 13:32:44 203

原创 数据结构常用算法总结(一)AVL,Dijkstra,Floyd

一,建立使用AVL树#include<iostream>#include<queue>using namespace std;struct Node {//二叉树结点 Node* left; Node* right; int key; Node(int a) { key = a; left = nullptr; right = nullptr; }};class AvlTree{ public: Node* roots;

2022-01-31 11:57:31 612

原创 PAT甲级题库 1009 Product of Polynomials (25 分)

题目1009 Product of Polynomials (25 分)This time, you are supposed to find A×B where A and B are two polynomials.Input Specification:Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial

2022-01-29 15:08:45 154

原创 PAT甲级题库 1007 Maximum Subsequence Sum (25 分)

题目1007 Maximum Subsequence Sum (25 分)Given a sequence of K integers { N1, N2, …, NK}. A continuous subsequence is defined to be { Ni, Ni+1, …, Nj} where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its eleme

2022-01-27 17:34:58 202

原创 C++新特性(二)更安全的强制类型转换

C语言原来有简单的语法实现强制类型转换,为什么C++还要确定新特性实现强制类型转换呢?归根到底是因为C语言强制类型转换有以下三个缺点。1,没有从形式上体现转换功能和风险的不同。例如,将int强制转换成double是没有风险的,而将常量指针转换成非常量指针,将基类指针转换成派生类指针都是高风险的,而且后两者带来的风险不同(即可能引发不同种类的错误) , C语言的强制类型转换形式对这些不同并不加以区分。2,将多态基类指针转换成派生类指针时不检查安全性,即无法判断转换后的指针是否确实指向一个派生类对象。3

2022-01-26 11:22:39 3372

原创 Mysql数据库基本操作(十三)锁机制

1,基本概念1,锁是计算机协调多个进程或线程并发访问某一资 源的机制(避免争抢)。2,在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题3,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。锁的分类(读的时候有印象即可,主要看下面锁的操作这一部分内容来理解锁)1,从对数据操作的粒度分:1)表锁:操作时,会锁定整个表。偏向M

2022-01-25 16:39:38 728

原创 Mysql数据库基本操作(十二)事务

1,基本概念1,只有innodb存储引擎支持事务,行级锁定,外键2,事务处理可以用来维护数据库的完整性,保证成批的sQL语句要么全部执行,要么全部不执行3,事务用来管理DDL、DML、DCL操作,比如insert,update,delete语句,默认是自动提交的。4,为什么我们需要事务管理DDL,DML,DCL操作?因为这些操作都是对数据库有一些增删改的动作,有时候为了完成一个逻辑动作必须要用两个或者多个sql语句执行这个逻辑动作。因此我们必须确保这些sql语句都成功或者都失败。例如银行转账问题,转

2022-01-25 16:00:23 3157

原创 PAT甲级题库 1006 Sign In and Sign Out (25 分)

题目1006 Sign In and Sign Out (25 分)At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’s and out’s, you are supposed to fin

2022-01-23 19:33:52 355

原创 1005 Spell It Right (20 分)

题目1005 Spell It Right (20 分)Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output every digit of the sum in English.Input Specification:Each input file contains one test case. Each case occupies one line whi

2022-01-23 18:07:03 288

空空如也

空空如也

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

TA关注的人

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