自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分治-快排思想题集1

当右边区域的元素数量小于k时,那说明第k大的元素不在该区域内,此时如果中间区域加上最大区域的元素个数大于k,那么说明第k大的值在中间区域,直接返回中间区域的任意一个值即可。当最小区域的数大于k的时候,那我们继续对最小区域的数进行排序,直到中间区域加上最小区域的数大于等于k,那我们就可以直接返回(因为题目中不要求有序,所以符合条件就直接返回),如果左区域和中间区域的元素个数小于k,那我们就只对右区域的(k- a-b,a,b分别为左,中区域的元素个数)个数进行排序即可。大家有兴趣可以看一下,

2024-04-15 18:48:48 940

原创 滑动窗口题解2

来记录right遍历的时候存入的有效字符。什么是有效字符,比如p的字符个数为2,那么我们用滑动窗口遍历字符串s的时候,如果这个字符在mapP中,并且mapS的该字符个数小于等于mapP时我们就count++,如果遇到的字符不在mapP中count就不++。当我们再2开始遍历的时候可以发现和从0开始遍历是相同的,因此到2的时候就无需再遍历一次了。这道题的思考点在于如何直到是否有两种以上的不同数字,我们可以用map,如果map.size()没有超过2,那么继续往里面加,如果超过2那么就左移left。

2024-04-15 18:48:38 683 1

原创 二分法题集1

二分法题记归纳与总结

2024-04-06 20:20:53 1245 2

原创 二分法题集2

接下来我们要找到这道题的二分性。我们可以发现如果选取数组第一个值为参考时,则最小值到该数区域内均大于该数,最小值到数组末尾均小于该数,那么我们就可以转换为找出第一个小于数组0小标值的元素。这道题中题目给了我们思路,目标值的左边均是递增,目标值的右边均是递减,那么我们就可以根据递增递减作为二分依据,然后就可以将题目转换为找出数组中最后一个递增的下标(同理我们也可以转换为找出第一个递减的下标)。1 数组中左右边界值都是无穷小,因此我们可以理解为,递增数组的最后一个值就是峰值,递减数组的第一个值就是峰值;

2024-04-06 18:46:48 380 1

原创 泛型的进阶

本文介绍了泛型的进阶----通配符以及泛型基础知识的链接

2024-03-27 21:24:32 297

原创 字符串常量池

当hello第一次出现的时候,系统先会在常量池中是否存有hello,如果没有那么就在常量池中存储hello,当第二次使用hello的时候,这时在常量池中可以找到hello,hello就不需要在存储了。再来看这两张图,我们要注意,s1中会创建新的对象,这个对象指向的是一个字符数组,并不会存储在常量池中,只有s2的“abc”会存储在常量池里。s1和s2并没有创建新的String对象,s1,和s2的地址相同,都指向的是常量池中的String对象。s3----->创建的String对象------>常量池字符。

2024-03-27 21:22:14 314

原创 数组划分,双指针

代码中,要先让desc == -1,防止数组第一个元素是0,如果arr[cur]不为0,那就让desc++,并且,我们提到,数组左边到desc是非0区,所以如果遍历到的不是0,那么就要放到非0区,而放到非0区的做法就是交换desc后一位元素和当前元素的位置。因此,desc指向的是非零元素的最后一个元素。这个时候分析案例可知,有个特殊情况,当快指针在倒数第二个位置时,慢指针为0的话,此时快指针会走两步,那么快指针就会越界,这种情况下,当我们在复写的时候,末位置的0不需要复写,因为我们处理完这种特殊情况即可。

2024-03-24 23:02:40 651 2

原创 链表精选题集

上面说过,如果改变某一个节点的指向时,那么这个节点之后的可能就会丢失。这道题就按常规思路来解题,我们要想判断两个链表是否相交,那我们就要看他们是否有相同的节点,如果有的话,那么这个节点及其以后的都一样,只是这个节点前的部分不一样,假设有个指针指向节点A,另一个指针指向节点B,如果两个链表相同节点前部分长度相同,那么只需要A,B走相同步数就可以走到相同节点,但是如果长度不一样差了n步,那么我们就可以先让长的链表先走n步,之后两个链表再一起走,如果A==B那么说明两个链表相交,否则不相交。

2023-12-30 20:53:23 928 4

原创 链表的详细介绍

链表中每个元素称为节点,每个节点由两部分组成(单向链表):数值和next域,next域存储下一个节点的地址,例如下图,可知链表在内存上不一定连续链表又节点和头节点组成,每个节点又由数值和next域组成,那么我们可以把节点定义做内部类‘定义成静态内部类比较方便应用,再者为什么next的类型时ListNode呢,因为每个节点的nxet域是指向下一个节点的,因此头节点和next的类型均为ListNode;同时因为每个链表的头结点只有一个,所以应该定义在LIstNode之外。链表的集合类;

2023-12-26 18:16:48 888 6

原创 ArrayList和顺序表

ArrayList是Collection的子类,所以arrayList满足第一个条件,arrayList中的元素均是String类型的,所以当传入参数的元素类型是String或者其子类的时候就可以编译成功;ArrayList就类似数组,但为什么还有创建这个类,是因为当我们需要知道并运用这个数组的有效存储元素时,数组是无法满足的(比如数组整体有五个元素的大小,但实际上只存储了三个元素),而且ArrayList当中有很多方法可以使用;但与字符串不同的是,字符串的改变是产生新的对象,常见的有:顺序表,链表。

2023-11-28 00:52:15 1077 18

原创 泛型的详细介绍

第三处,泛型就可以作为一个类型,其类型的决定取决于实例化泛型类时所给的类型,例如MyMap<>中给的是String类型,那么T就代表String类型,给setArray传值的时候也必须传String类型,在实例化MyMap的时候,也就是第五处的<>可以不写类型。数组是一种单独的数据类型,int[],double[],Object[]都是各自独立的数据类型,不同于String,Object数组不存在继承关系,因此无法将int[]类型的数组传给Object[]类型的数组;由基础类型转为包装类型叫做装箱;

2023-11-26 14:12:47 939 8

原创 时间复杂度和空间复杂度简单介绍

简单认识复杂度即可,配有案例练习,为数据结构做准备

2023-11-23 16:23:40 53 7

原创 异常的详细介绍

因为有时候程序与运行可能不符合预期,所以我们会通过抛出异常来定位哪里的代码不符合预期。实现代码:我们先看系统中异常类的写法,然后仿照来写:继承了一个类,并写了两个构造方法注意这里的自定义异常可以继承两个类 Exception(继承后默认是受查异常) 或者 RuntimeException(非受查异常)

2023-11-22 20:27:09 47 7

原创 抽象类和接口

使用关键字:interface加接口名一般定义接口名的时候以大写“I”开头,并且接口名最好是形容词。

2023-11-20 17:19:35 77 12

原创 类和对象详解2

如果我们要写一个函数,不用向下转型的话,那么形参就得设置某一具体类,如果我们想实现猫和狗的特有方法,那么就得写两个函数去分别实现他们的特有方法,但是如果用到向下转型,那函数只需要写一个,无非多写点if而已。动态绑定:即在编译时期无法确认你要是用的方法,例如在向上转型中,调用Animal.eat(),在编译的时候认为你是在调用父类方法,但在运行中会去调用子类的重写方法。同普通代码块,只需要用{}括住即可,但是和普通代码块的位置不一样,实例代码块是在类内,方法外的;构造代码块在创建对象的时候被调用;

2023-11-18 17:34:12 69 16

原创 类和对象的详解1

类是对对象的描述对象是类的实例化。

2023-11-16 21:57:28 66 16

原创 图书馆管理

这个是向上转型,用父类调用的时候,只有方法会进行动态绑定,即如果子类重写了父类的方法,用多态的时候调用的是子类方法不是父类方法。定义了一个接口,接口最为重要,虽然里面只有一个抽象方法,但他的连接作用最为重要通过每个功能类对接口的实现从而创建接口数组,接口中数组元素的不同是来实现管理员和普通人的区分。我们将每一个功能(借,还,增,添图书等)都定义一个类,将功能写进去(此时功能名都一样),之后再定义一个接口,每个功能类都实现这个接口,这样就可以通过调整接口数组中的成员来区分管理员和普通人。

2023-11-15 20:24:29 196 13

原创 C语言文件保存

num指fgets读取的个数,实际上只读取num-1个,第一个参数是指将所读数据所存放的地址,并且fgtes遇到\n也会自动停止读入,读取失败返回NULL,读取成功返回储存数据的缓存地址。fscanf(arr,"%f-%c-%d",&(tem.f),&(tem.c),&(tem.n))即将arr的数据依次读取存入tem.c等中。eg:fprintf(arr,"%f-%c-%d",s.f,s.c,s.n),即将后面的变量转化为字符串存入arr。

2023-10-21 12:07:52 621 4

原创 程序翻译环境以及宏介绍

(a++):(b++)),3小于5,因此执行后面的表达式,同时a和b各增1,由于只计算后面的表达式,所以b再加1,而a不会再加.注意?eg #define MALLOC(num,type) (type*)malloc(num*sizeof(type)),这样用malloc就会方便。(连接器在vs叫link.exe)缺点 大幅增加代码长度(因为每次使用宏宏的代码就会插入程序中,而函数只有一段),没法调试,容易带来运算符优先级问题,易出错。宏较函数的优点是效率高,占用小,执行过程简单,而且没有类型的限制。

2023-10-21 10:53:03 30 1

原创 操作符详解

对于有符号的整数来说,最高位的1位是符号位;2种右移方式:逻辑右移(补码的最后一位丢弃,在第一位前补0 ),运算右移(补码的最后一位丢弃,在第一位前补原符号位,即负数补1整数补0);sizeof(arr),结果为4或者8(32位或64位),因为此时数组相当于指针,括号中的相当于int(char)* p,因此sizeof求出的是指针地址 的大小。此时由于a++是先赋值后使用,a++给出的值时0,所以这个逻辑语为假,a++之后的就不再进行计算,故b,d的值不会改变,a为1,i为0。法2(效率低):a=a^b;

2023-09-13 17:09:56 37 4

原创 C语言三字棋

首先我们需要三个源文件,分别写入主函数,整体的游戏过程和思路;每轮游戏都必须要格式化棋盘,而做棋盘的思路是二维数组加“—|”,通过调节打印的顺序从而完成棋盘。此次代码中至关重要的一个小细节:当对char类型的数组遍历赋值或者判断时必须用单引号,不能用双引号;小技巧,当产生的随机数%3(井字棋时3*3)那么生成的数就只可能时0,1,2了。人下棋:玩家输入相应坐标,该位置在判定完是否有坐标后,就可以落子或者重新输入;整体做下来发现,难的不是代码而是逻辑,也可以说是代码思维,这一点勤能补拙;

2023-09-10 20:59:13 41 2

空空如也

空空如也

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

TA关注的人

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