- 博客(37)
- 收藏
- 关注
原创 Java关于抽象类和抽象方法
抽象方法的定义格式:public abstract 返回值类型 方法名(参数列表)抽象类的定义格式:public abstract class 类名{}
2025-04-01 22:01:52
219
原创 算法学习之BFS
我之前疑惑的点是while(!q.empty())不知道什么时候停止,后来想了想,觉得如果广搜到最后一个位置的话,怎么判断,所以在代码中加了一个判断是否到达目标点的判断。从起点开始,往前走一步,记录下所有第一步能走到的点开始,然后从所有第一部能走到的点开始向前走第二步,重复下去,一直到终点,输出步数即可,关于BFS我的理解是根据离我们当前这个点的权重来移动,这里权重也可以理解为离这个点的距离,实现方式:广度优先搜索。下面这个做法是模拟队列。下面是用队列写的方法。
2025-03-30 16:19:31
366
原创 JAVA关于继承
this:理解为一个变量,表示方法调用者的地址值。super():代表父类存储空间。关键字 访问成员变量 访问成员方法 访问构造方法this this.成员变量 this.成员方法() this.()访问本类成员变量 访问本类成员方法 访问本类构造方法super super.成员变量 super.成员方法() super()访问父类成员变量 访问父类成员方法 访问父类构造方法this.()访问本类构造方法可能有人不懂,写一段代码.int age;//this.表示调用其他构造方法。
2025-03-27 02:53:13
1298
原创 JAVA关于static静态
这是个方法类,可以看到构造方法用private修饰不能创建对象,不过能用方法。static表示静态,是java中的一个修饰符,可以修饰成员方法,成员变量。2.私有化构造方法,(不创造对象,因为只是个方法,之调用其中的方法)创造一个学生类,变量有校长,在一个学校的学生都共用一个校长吧?所以可以定义校长为static String name;这里提到了工具类回顾一下三种类。3.方法定义为静态(都可以用)
2025-03-26 19:04:54
467
原创 DFS深搜
给定一个整数 n𝑛,将数字 1∼n 排成一排,将会有很多种排列方法。按字典序输出所有排列方案,每个方案占一行。在这里假如n=3,需要看一共有几种组合方法。现在,请你按照字典序将所有的排列方法输出。对于DFS深度搜索就像是一条路走到黑。对于这道题把思路转化成代码就是。共一行,包含一个整数 n。红色的就是 深搜的路线;
2025-03-23 20:22:19
245
原创 JAVA关于String字符串
可以看作是一个容器,创建之后里面的内容是可以改变的作用:提高字符串的操作效率public StringBuilder append(任意类型) //添加数据,并返回对象本身public StringBuilder reverse()//反转容器中的内容从头到尾public int length() //返回长度(字符出现的个数)public String toString()//通过toString()就可以把StringBuilder转换成String。
2025-03-21 19:24:18
1179
原创 KMP字符串
核心思想:在每次失配时,不是把p串往后移一位,而是把p串往后移动至下一次可以和前面部分匹配的位置,这样就可以跳过大多数的失配步骤。而每次p串移动的步数就是通过查找next[ ]数组确定的。在这个图中1和3中的字符一样3后的不符直接移动至1看符合不符合,还不符合继续移动,不过这种移动是直接移动至能匹配的点,如果都不能匹配,最后会移动至头部从新开始,这样省了很多步骤。=p[j+1]的时候不用移动一格,只需要移动至下一次能匹配的位置。这个题最重要的是寻找模板式上的前缀和后缀的最长共有元素的长度。
2025-02-16 14:50:34
262
原创 P2440木材加工
因为偏左,如果只有1和0那么除数mid不能等于0,所以设置循环条件为l>1,也就是当1和0的时候mid等于1,如果切的总段数小于指定段数r等于mid-1也就是0,然后结束,输出l;题目意思:就是给你几段木头需要把他们切成固定段,保证切的长度最大,切的段数不就是,每段木头除以每段长度吗,如果切的总段数大于指定段数,长度就可以再加,就是用二分查找这个最大长度;如果连 1cm \text{1cm}1cm 长的小段都切不出来,输出。但是mid就不能等于l+r>>1;
2025-01-15 11:04:04
113
原创 P1678 烦人的高考志愿
根据 𝑛n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。(或者l+r+1>>1)a[mid]肯定比a[l]或者a[r]离目标数更近;先说一下对这道题的理解,如果要找与目标数最进的数就要考虑a[mid]等于目标数的情况;所以上面的模板l=mid,r=mid;但是不能还和之前的二分模板一样,因为之前的暂停条件是l=r;因为不必须寻找等于目标数的元素,所以l和r不一定要相同;a[mid]=5>2;a[mid]=6>2;
2025-01-14 20:40:46
358
原创 P1102 A-B数对
那就是找A-C我的建议是从后开始一步步缩减范围,因为写二分不得先排序吗?从后往前一步步减小,因为B=A-CB小于A所以右指针直接变小就行。其中if (a[i] == a[i - 1])res += num;这一句就是优化一下,如果后一位数和前一位数相同的话,直接加num就行。可以看出在(1)中l和r在每次查找都是1和n。在(2)中左指针会跟着i的变化而变化。这道题因为要找A-B=C的个数;我们可以(1)固定A找B。也可以(2)固定B找A;两种方法,如果选择(1)但是(2)方法中用了。
2025-01-14 11:40:11
198
原创 二分查找关于check()问题
所以定义SL(Searchleft)函数查找左边界的时候mid=l+r>>1(整型运算不会进一所以对于整体偏左);我理解的二分查找分为查找左和查找右,因为一个数组,如果要查找这个数是数是第几位,还得知道在这个数组中有几个目标值。(1)check()函数的条件应该是a[mid]大于等于目标数,因为把如果大于等于的话,你就得规定了r=mid;(2)但是如果你把check()条件设置为a[mid]小于等于目标数,就的规定l=mid;查找2的话左边界为1,右边界为2;所以查找左边界应该如条件一。
2025-01-13 22:55:49
171
原创 N的阶乘和
在这之中a[i]就是上一个数的阶乘,然后求出一个阶乘后立刻用高精度加法加在b数组里;如果a的长度比b大,那么先操作b的长度至少等于a。可以把这个问题拆分为先求各位数的阶乘,再求和。对于阶乘,可以看作前一个数的阶乘×自己嘛;所以每求一个阶乘就是前一个的阶乘乘自己。
2025-01-13 11:49:10
178
原创 关于轮转的问题
1 2 3 4 5 6 7//编号。也就是轮转到第2位了可以看作(1+8)%7。//加上N和取余N其实抵消了(当这个数大于零的时候)再减去4也就是第5位可以看作(2-4+7)%7;所以这类题关于到了第几位数可以有一个模板吧;比如一个圈转完一圈后还会回到原点;减去B则会得到(C+N-B)%N;我说的轮转是在规定的一个范围内。加了A则会到(C+A)%N;//如果小于0则如本题;先用7个数演示一下;
2025-01-12 17:05:02
185
原创 高精度除法(高精度除低精度)
然后在加减乘的时候最低位是存的低位数,所以输出的时候从最后开始;在除法中第一位(也就是最高位)小于被除数则*10+下一位;所以用reverse函数反转在处理前导零。但是除法最先装的是高位数;所以在算法中也这样;
2025-01-12 15:36:12
177
原创 高精度减法
第一个if函数是当两个数的数位不相同时返回return A.size() > B.size();如果真返回1反之0;在sub(减法函数)中因为减法有时候需要进位,所以在函数中设置了。只不过多了个cmp函数判断在减法函数中谁减谁。新的动态数组加上 (t+10)%10;这个函数是判断在减法函数中到底是谁减谁。bool函数只返回0或者1(真或者假)for循环就是从最高位开始排查看谁大;如果t是
2025-01-12 12:46:26
162
原创 高精度乘法
首先需要把他们存入vector动态数组,放入函数,其次因为如果A[3]*B[3]的话先验算一下;等于说如果A[i ]*b[j]=C[i+j]最后对于C进行处理;
2025-01-12 10:13:59
146
原创 NOIP2015扫雷游戏
在 𝑛n 行 𝑚m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。将*定为1,其他则为零,最后输出的时候,将1输出为*,其他位置则输出八个方向相加的值;字符 * 表示相应格子是地雷格,字符?用 * 表示地雷格,用周围的地雷个数表示非地雷格。现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
2025-01-11 16:03:51
235
原创 高精度加法
(2)为了方便计算从后开始相加,也就是最低位(个十百千万等)可以输到vector中,使用push_back()函数,将char类型数字改成int类型只需要减去’0;(4)需要设置一个变量来当作进位的中转站就比如14+15=29需要一个变量装下他,然后%10装入最后需要返回的数组中(vector类型)装入之后/=10;(1)可以用string类型,因为他有.size()容易使用,输入string类型变量;(6)因为到目前为止最小位是第一个,但是输出需要先输出最大的,所以从后往前输出。
2025-01-10 22:59:05
99
原创 宿舍信息管理系统
printf("请输入新房间类型 (当前: %s): ", dormitories[i].room_type);printf("请输入新容量 (当前: %d): ", dormitories[i].capacity);printf("请输入新班级 (当前: %s): ", students[i].class_name);printf("请输入新楼层号 (当前: %d): ", dormitories[i].floor);
2025-01-06 23:00:54
929
原创 实数取整1440
读入一个实数,输出实数的整数部分。注意该实数的位数不超过100位。输入的整数部分可能含有不必要的前导0,输出时应去掉,当然,若整数部分为0,则该0不能去掉。如输入0023.56732,输出应为23,而不是0023;0.123对应的输出应为0。当然输入也可能不含小数部分。//将字符串p表示的实数取整后生成新的字符串,并由函数返回。
2025-01-03 14:43:27
331
原创 快速排序。
/在这里还有下一行不能<=或者>=会内存超限。当边界是j也就是右边划分x不能选q[r]应该是q[l]或者q[(l+r)/2]1(x=q[l]或者q[(l+i)/2])如果n分成0和n或者n和0就会无限划分。目的是防止无限循环;
2025-01-03 14:37:34
210
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人