java
文章平均质量分 86
允歆辰丶
一个平平无奇的码农
展开
-
不用运算符的加法运算
1.知识预备注意:下面所有的结论的进位是考虑二进制的进位,因为我们使用的位运算符,是针对二进制进行的. 结论一:在不考虑进位的情况下,其无进位加法结果为 a⊕b. 结论二:而所有需要进位的位为 a & b,进位后的进位结果为 (a & b)原创 2023-05-30 16:16:42 · 930 阅读 · 32 评论 -
深拷贝和浅拷贝
以下是Java中Object类中clone()方法,我们可以看到clone()方法是没有方法体的,因为clone是一个native类型的代码,具体的代码实现在JVM的c++代码中实现,Java只是调用.1.一种是递归的进行拷贝具体应该将Person类中的clone()方法进行如下的修改但是这种方法已经是很老旧的方法了,现在计算机实现已经不采用了这种方法了,现在使用的深拷贝方法是第二种方法.2.Json字符串的方式进行深拷贝原创 2023-04-13 09:30:19 · 948 阅读 · 20 评论 -
手撕LRU和LFU缓存淘汰算法
LFU()算法是一种用于缓存替换的算法,其思想是淘汰最少被使用的缓存数据。它的基本原理是根据每个数据块的使用频率来决定其是否被淘汰。LFU算法主要用于高速缓存中,以保证缓存空间的高效利用。LFU算法的实现需要一个计数器来记录每个数据块被使用的次数,当缓存空间满了时,选择使用频率最低的数据块进行替换。如果多个数据块的使用频率相同,则选择最早使用的数据块进行替换。LFU算法的优点在于它能够较好地适应不同访问模式下的缓存需求,并且能够保证缓存空间的高效利用。原创 2023-03-29 17:48:54 · 731 阅读 · 16 评论 -
耐心排序之最长递增子序列(LIS)
耐心排序(Patience Sort)是将数组的元素分类成很多堆再串接回数组的一种排序算法,这一种排序算法受到一种叫做patience game的纸牌游戏的启发,主要用于解决最长递增子序列的问题2.操作步骤创建一个堆数组比较目前指向的元素和每个堆的第一个元素,计算出比目前元素小的堆若目前元素比所有堆的第一个元素大创建新的堆并加入到堆数组中,否则将目前元素加入到最先创建的堆(也就是最左边的堆);原创 2023-03-28 10:59:31 · 1296 阅读 · 24 评论 -
详解LinkedHashSet和LinkedHashMap
顾名思义,根据名字我们可以知道LinkedHastSet和LinkedHashMap的,具体是使用实现的,下面是继承树,,因此HashMap中的方法,在LinkedHashMap中都是可以使用的.(LinkedHashSet一样具体在实现LRU缓存淘汰算法上有应用,只要就是应用的LinkedHashMap的存储的顺序和添加的顺序是一样的特性,我们对于不经常使用的数据进行淘汰处理,这个时候我们需要确保存储的顺序和添加的顺序保持一致性,也就是当内存满了之后,先添加的进行淘汰,具体的讲解明天进行博客的更新!!!)原创 2023-03-27 17:22:37 · 1161 阅读 · 13 评论 -
笔试常考: 队列实现栈 and 栈实现队列 and 验证栈序列
因为队列的先进先出的,所以这里栈一定要把先进的元素放在栈的顶部,这样才能够满足队列的结构,也就是说我们要把栈的结构倒转过来,这时候一定需要另一个栈的辅助,比如入栈的顺序为{1,2,3,4},这个时候放入到栈中的顺序应该为{4,3,2,1},这样出栈的顺序满足出队列的先进先出的原则.接下里我们使用演示的方式看看如何实现这个功能。经历了上面的双队列实现栈,我们其实可以很容易的想到如何使用单队列实现栈的功能,我们只需要每次入队列指定的元素,然后将队列之前的元素重新入队列,便可以实现栈的功能,接下来看演示。原创 2023-03-23 15:32:49 · 721 阅读 · 20 评论 -
字符串的反转以及巧用反转 ------关于反转,看这一篇就足够了
字符串的反转是一个不算难的问题,单纯的字符串整个反转是十分容易的,有难度的的是局部反转,但进入到局部反转之前,我们需要把字符串的整体反转搞清楚.这篇文章虽然主要介绍了字符串的反转,但是还包含了数组的反转,无论是字符数组和整数数组,都进行了讲解.接下来的一些将从力扣的一些题目由易到难的对字符串的反转问题进行系统化的讲解.原创 2023-03-22 17:16:37 · 3074 阅读 · 11 评论 -
前缀树(字典树/Trie) -----Java实现
字典树(Trie树)是一种,常用于。字典树的核心思想是。它是一棵,每个代表一个,从。字典树的,每个,从根节点到任意一个节点所经过的路径上的字符连接起来即为该节点所代表的字符串。每个节点可以存储一个或多个字符串,通常使用一个。当需要在一组字符串中查找某个字符串时,可以利用字典树来实现高效的查找操作。原创 2023-03-21 12:47:18 · 1569 阅读 · 20 评论 -
Java之链表(不带头结点,带头结点,迭代实现,递归实现)
在实现具体的方法之前,我们先定义一个接口,之后的这些链表都将实现这些接口,实现这些接口内的方法,主要包含了一些常用的CRUD方法.这个接口我们使用了泛型,之后的链表类也将继承这个接口的泛型,元素的类型就是泛型的类型// 在线性表中的最后插入值为element的新元素// 在线性表的前边插入新元素,插入后的元素下标为index//在索引为index处插入值为element的结点// 删除当前线性表中索引为index的元素,返回删除的元素值// 删除当前线性表中第一个值为element的元素。原创 2023-03-20 20:56:18 · 1157 阅读 · 20 评论 -
求最大公约数和最小公倍数---辗转相除法(欧几里得算法)
(Greatest Common Divisor,简称GCD)指的是两个或多个整数共有的约数中最大的一个数。例如,整数12和30的约数有1、2、3、6,但其中最大的约数是6,因此12和30的最大公约数是6。最大公约数在数学中有着广泛的应用,例如可以用于简化分数、判断两个数是否互质、求解线性方程等。特殊的gcd(0,n)为n,n为任意数(Least common multiple , 简称LCM)是两个或多个整数中最小的能够被这些整数整除的正整数。换句话说,最小公倍数是这些整数的公共倍数中最小的一个。原创 2023-03-14 20:14:37 · 2822 阅读 · 18 评论 -
并查集(不相交集)详解
并查集(Disjoint-set Union 或 Union-find)是一种数据结构,用于维护一些不相交(disjoint)的集合,支持合并两个集合以及判断两个元素是否属于同一个集合。并查集可以使用树来实现,每个集合可以看做是一棵树,代表元素是根节点。使用路径压缩可以减少查找操作的时间复杂度,使用按秩合并可以减少合并操作的时间复杂度,使得并查集的时间复杂度可以达到近乎常数级别,因此在一些算法中广泛应用,比如 Kruskal 算法和 Tarjan 算法。原创 2023-03-13 16:30:50 · 2207 阅读 · 12 评论 -
快速排序/快速选择算法
快速选择算法其实是快速排序算法的变形,主要用于解决寻找第k大元素或者第k小元素,当我们需要寻找找到(排序后)第k个元素的时候,不要求数组的所有元素必须有序,这个时候我们可以选择使用快速选择算法,因为快速选择算法的时间复杂度比直接使用快速排序的时间复杂度低快速选择的时间复杂度:O(n)快速排序的时间复杂度:O(nlog(n))①中轴值最终能交换到第k个位置,说明我们找到了第k个元素②中轴值最终的位置大于第k个位置,此时我们只需要对中轴值左边的元素进行快速排序。原创 2023-03-11 14:23:09 · 2902 阅读 · 23 评论 -
Java之深度优先(DFS)和广度优先(BFS)及相关题目
1) 深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点,可以这样理解:每次都在访问完后首先访问。2)我们可以看到,这样的访问策略是优先往纵向挖掘深入而不是对一个结点的所有邻接结点进行横向访问。3)显然,深度优先搜索是一个的过程(可以用栈来模拟)例如这个图进行。原创 2023-03-14 08:07:14 · 1393 阅读 · 14 评论 -
Java之内部类
类比于成员方法,在成员方法中是不可以定义static的属性的,因为方法的调用需要对象来调用,而static的变量是不需要对象调用的,这显然是矛盾的静态内部类可以看做相当于一个普通的类,只不过嵌套在了外部类的里面了而已System.out.println("静态内部类的静态方法method");//通过外部类的对象访问其私有属性和方法//外部类通过对象访问静态内部类中的私有属性和方法System.out.println("外部类的fun方法");3.产生静态内部类的对象。原创 2023-03-07 19:20:48 · 3140 阅读 · 9 评论 -
快速幂----快速求解底数的n次幂
快速幂:快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N),与朴素的O(N)相比效率有了极大的提高。3.核心思想例如计算,10的二进制为1010,相当于求解次方相当于我们每次对10的二进制的每一个位置求权(如果是二进制这个位是1),则乘以当前的叠加的数,例如进行求余定义变量ans保存的结果 1010位10的二进制表达方式1010的第一位为0,这个时候num=num*num=;二进制形式为:1010的第二位为0,这个时候求权为1,ans=ans*num=;原创 2023-03-06 22:35:10 · 2195 阅读 · 9 评论 -
Java之可变参数
这个时候编译期间会进行报错我们思考下为什么不能定义两个可变参数,其实很容易就可以想明白,当我们调用函数的时候,我们出入一连串的值的时候,我们无法确定可变参数的分别有多少个,例如这个时候nums1可能有0到5个,nums2也有可能有0到5个当可变参数不是最后一个的时候,编译器会报如上的错误,这个时候我们把可变参数nums1放到参数x的后面就不会报错误了.原创 2023-03-06 18:01:08 · 970 阅读 · 9 评论 -
判断一个用字符串表达的数字是否可以被整除
当一个数字很大的时候,我们常用字符串进行表达,(超过了int和long等数据类型可以存储的最大范围),但是这个时候我们该如何判断他是否可以被另一个数整除呢?这个时候我们不妨这样来考虑问题,每次将前边求模之后的数保存下来,然后乘以10和这一位的数字进行相加的操作,一直重复这个步骤,知道最后一位,观察是否这个数字加之前剩余可以被整除,这就类似于我们小学做的除法的算式计算和一样例如这样:例如求数字"98244353"是否可以被3整除第一位:9%3=0,left=0;第二位:8%3=2,left=2;原创 2023-02-27 19:57:46 · 2041 阅读 · 12 评论 -
Java之关于String字符串笔试面试重点
我们学习过了字符串的不可变性,进入到change方法之后,字符数组直接在堆进行改变,而对字符串的改变,直接产生了新的字符串,str指向了新的地址,而主方法里的str指向的还是原来的地址,所以最后输出。第二个s1==s2,因为值为"abc"已经存在与常量池中了,不会将s2对象置入到常量池中,但是结果的返回值为s1的地址,此时令s2=s2.intern(),s2的地址便与s1的地址相同。这样一段代码,改变的是s1的引用,它的指向一直在改变,不断指向新的字符串常量。的时候,就会产生字符常量,放入到常量池中。原创 2023-02-20 13:20:33 · 1274 阅读 · 15 评论 -
Java之栈与队列(双端队列,优先级队列)及相关API
入栈 stack.push(1)出栈 stack.pop();栈顶元素 stack.peek()栈的元素个数 stack.size()栈是否为空 stack.empty()原创 2023-02-08 00:04:03 · 1679 阅读 · 0 评论 -
二分查找变式讲解
此时返回值可能存在四种情况:例如 [5,7,7,8,8,10],最后数组中含有7这个元素,所以最终查找到最右边7,返回下标:2[5,6,6,8,8,10],数组中不存在7这个元素,此时返回第一个大于7的元素的下标,即元素8第一个元素下标:3[1,2,3,4,5],数组中也不包含7,并且所有元素小于7,此时此时循环的过程中,right的值一直保持nums.length-1(即4),直到最后right原创 2023-01-09 10:20:50 · 392 阅读 · 0 评论 -
Java8新特性之Lambda表达式和Stream API
举例:格式:-> : Lambda操作符或箭头操作符->左边: Lambda形参列表(其实就是接口中的抽象方法的形参列表) ->右边: Lambda体(其实就是重写的抽象方法的方法体)本质:作为函数式接口的实例如果一个接口中只声明了一个抽象方法,则此接口就叫做函数式接口可以通过Lambda表达式来创建该接口的对象。原创 2022-12-19 19:34:25 · 1303 阅读 · 0 评论 -
Redis6初阶
1、解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN.2、解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis.3、解决性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearchNoSQL(NoSQL = Not Only SQL ),意即“不仅仅是sQL”,泛指非关系型的数据库.NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储。原创 2022-12-12 18:26:45 · 531 阅读 · 0 评论 -
Java中各种类型的转化
一.Integer和int之间的类型转化1.自动装箱 Integer integer=2; int a=integer; integer=a;2.构造器方法 Integer integer = new Integer(1);3.Integer.valueOf(int i) Integer integer = Integer.valueOf(10);二.Integer和String之间的类型转换1.String转换为Integer1.Inte原创 2022-12-11 14:11:05 · 7233 阅读 · 0 评论 -
Leetcode1805:字符串中不同整数的数目
给你一个字符串 ,该字符串由数字和小写英文字母组成。请你用空格替换每个不是数字的字符。例如, 将会变成 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):、、 和 。返回对 完成替换后形成的 不同 整数的数目。只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。注意:1.相同的数值只添加一次,2.前导0要去除:不如:001a001,相当于只含有一个1;我们先考虑到这个题目可以设置两个指针.start和end,刚开始start可以指向第一个数字字符开始的位置,然后end指向原创 2022-12-06 23:28:58 · 285 阅读 · 0 评论 -
Java实现之位运算符
当转换为二进制之后,对应位置相同为0,不同为1(或者记住奇数个1为0,偶数个1为1)将当前数字的二进制形式向右移n位,左边补(正数补0,负数补1),相当于除以2。将当前数字的二进制形式向右移n位,右边补0,相当于乘以2。之间的距离是它们的二进制表示中位置的绝对差。当转换为二进制之后,对应位置有一个为1的时候就为1。即右移之后,无论该数为正还是为负,右移之后左补0。当转换为二进制之后,对应位置同时为1的时候才为1。分析:阅读题目可以知道,只有一个元素出现一次,反转每一位的二进制,将1变成0,0变成1。原创 2022-12-06 17:23:39 · 485 阅读 · 0 评论 -
Linux
个人桌面领域的应用服务器领域linux在服务器领域的应用是最强的。 linux免费、稳定、高效等特点在这里得到了很好的体现,尤其在一些高端领域尤为广泛( c/c++/phpljava/python )。学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习1.先安装virtual machine 15.5.12.再安装Linux (CentOS 7.6/centOS8.1)在官网上安装:VMware - Delivering a Digital Foundati原创 2022-12-05 10:29:48 · 1057 阅读 · 0 评论 -
SSM整合
Spring提供了监听器,实现接口,可监听的状态,在web服务器的启动,读取Spring的配置文件,创建Spring的IOC容器。web 应用中必须在web.xml中配置DispatcherServlet在服务器创建是添加,如果没有配置这个监听器.当controller里面的方法对service方法进行自动装配的时候,这个时候显示不能自动装配上,因为springIOC容器还没有加载出来,选择监听器是因为监听器比Servlet先创建,而且只在服务器启动的阶段创建.原创 2022-12-02 00:01:29 · 656 阅读 · 0 评论 -
Java实现之马踏棋盘算法
1)马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。2)如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了53个点,如图:走到了第53个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看其他的路径,就在棋盘上不停的回溯.......,3)分析第一种方式的问题,并使用贪心算法(greedyalgorithm)进行优化。解决马踏棋盘问题.原创 2022-11-29 19:08:42 · 589 阅读 · 0 评论 -
Java实现之弗洛伊德(Floyd)算法
1)和Dijkstra算法一样弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名2)弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径3)迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。4)弗洛伊德算法vS迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点。原创 2022-11-28 22:38:51 · 340 阅读 · 0 评论 -
Java实现之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。原创 2022-11-27 22:41:23 · 2019 阅读 · 0 评论 -
Java实现之克鲁斯卡尔(Kruskal)算法
1)克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。2)基本思想:按照权值从小到大的顺序选择n-1条边,并确定这n-1条边不构成回路3)具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止。原创 2022-11-26 15:28:35 · 605 阅读 · 0 评论 -
Java实现之普利姆(Prim)算法
1)普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图2)普利姆的算法如下:(1)设G=(V,E)是连通网,T=(U,D)是最小生成树,v,u是顶点集合,E,D是边的集合(2)若从顶点u开始构造最小生成树,则从集合v中取出顶点u放入集合u中,标记顶点v的(3若集合u中顶点ui与集合v-u中的顶点vj之间存在边,则寻找这些边中权值最小的边,但不。原创 2022-11-24 16:25:26 · 677 阅读 · 0 评论 -
Java实现之动态规划算法
1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2)动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3) 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)4)动态规划可以通过填表的方式来逐步推进,得到最优解.原创 2022-11-22 10:09:06 · 1115 阅读 · 0 评论 -
Java数据结构之图
1)我们学了线性表和树2)线性表局限于一个直接前驱和一个直接后继的关系3)树也只能有一个直接前驱也就是父节点4)当我们需要表示的关系时,这里我们就用到了图图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。原创 2022-11-21 15:42:21 · 2054 阅读 · 1 评论 -
Java实现之贪心算法
1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。原创 2022-11-23 18:52:48 · 262 阅读 · 0 评论 -
Java实现之KMP算法
1) KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法2) Knuth-Morris-Pratt字符串查找算法,简称为“KMP算法”,常用于在一个文本串S内查找一个模式串P的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法.原创 2022-11-13 21:00:00 · 975 阅读 · 0 评论 -
Java算法之分治算法
分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题.....直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换).................原创 2022-11-20 20:56:23 · 788 阅读 · 0 评论 -
Java数据结构之八大排序算法
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)也是一种简单的排序方法。原创 2022-11-05 13:52:17 · 1338 阅读 · 0 评论 -
Java数据结构之二叉树
1) n个结点的二叉链表中含有n+1【公式2n-(n-1)=n+1】个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种3)一个结点的前一个结点,称为前驱结点4)一个结点的后一个结点,称为后继结点。原创 2022-11-09 10:53:02 · 1106 阅读 · 0 评论 -
每日一题:由卢卡斯队列引出java四舍五入
黄金分割数 0.6180.6180.618 与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的 0.6180.6180.618 处,墙上的画像一般也挂在房间高度的 0.6180.6180.618 处,甚至股票的波动据说也能找到 0.6180.6180.618 的影子....黄金分割数是个无理数,也就是无法表示为两个整数的比值。原创 2022-11-03 14:40:51 · 142 阅读 · 0 评论