![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
徒步的水獭
这个作者很懒,什么都没留下…
展开
-
剑指offer-- 对称的二叉树(Java)
题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。思路如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?如果同时满足下面的条件,两个树互为镜像:它们的两个根结点具有相同的值。 每个树的右子树都与另一个树的左子树镜像对称。实现 boole...原创 2019-08-01 11:13:25 · 251 阅读 · 1 评论 -
剑指offer-- 丑数(Java)
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。思路: 直观思路:从1开始逐一判断每个整数是否为丑数,直到找到第n个丑数,时间效率太低。因为对于每一个整数都要计算,即使一个整数不是丑数,也要进行除法和取余操作。 空间换时间的解法: 创建数组存...原创 2019-03-04 11:27:23 · 133 阅读 · 0 评论 -
剑指offer-- 删除链表中重复的结点(Java)
题目:在一个排序的链表中,如何删除重复的结点?思路: 设置一个preNode,用于记录当前结点的前一个结点,如果当前结点和后一结点的值相同(记该值为dupVal),通过循环往后找到第一个不为dupVal的结点,把该结点设置为当前结点,并赋值给preNode.next,即相当于完成了删除操作;而当前结点和后一结点的值不相同时,把当前结点和preNode往后移一位即可。 实现:...原创 2019-03-03 15:45:28 · 179 阅读 · 0 评论 -
剑指offer--包含min函数的栈(Java)
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路: 要定义一个变量存储min值,每次push进一个新的值,随之改变min的值,但是当最小元素弹出时,min变量无法捕捉之前的值,因此定义一个辅助栈来存放最小元素,把每次的最小值都存储下来 栈 3,4,2,5,1 辅助栈 3,...原创 2019-02-26 21:54:52 · 141 阅读 · 0 评论 -
剑指offer--用两个栈实现队列(Java)
题目:用两个栈实现一个队列。完成在队列尾部插入结点和在队列头部删除结点的功能。思路: 试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入;删除时,直接出栈无法实现队列的先进先出规则,这时需要将stack1中的所又元素出栈,压到另一个栈stack2中,然后再从stack2中出栈就OK了。需要稍微注意的是:当stack2中还有元素,stack1中的元素不...原创 2019-02-26 21:16:38 · 191 阅读 · 0 评论 -
剑指offer-- 链表中环的入口结点(Java)
题目:一个链表中包含环,如何找出环的入口结点?思路: 1.确定链表是否有环:通过两个不同速度的指针确定,当两个指针指向同一个结点时,该链表含有环,并且相遇点在环内。 2.确定环中结点的数目n:指针走一圈,边走边计数 3.找到环的入口:从头结点开始,通过两个相差为n的指针来得到(快指针先走n部,然后快慢指针的相遇点就是环入口节点)考点:代码的鲁棒性实现: public...原创 2019-03-02 21:03:48 · 239 阅读 · 0 评论 -
剑指offer--二叉搜索树的后序遍历序列(Java)
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路:二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面。根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能。考点:举例让抽象问题...原创 2019-02-26 18:23:18 · 176 阅读 · 0 评论 -
剑指offer--二叉搜索树的第k大结点(Java)
题目: 给定一棵二叉搜索树,请找出其中的第k小的结点。思路: 二叉查找树的中序遍历结果是节点的从小到大排序序列 设置全局变量index=0,对BST进行中序遍历,每遍历一个结点,index+1,当index=k时,该结点即为所求结点。考点:知识迁移能力实现:int index=0; TreeNode KthNode(TreeNode pRoot...原创 2019-02-26 16:08:03 · 378 阅读 · 0 评论 -
查找
二分查找:二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。如果面试题要求在排序的数组(或者部分排序的数组)中查找数字或者统计某个数字出现的次数,都可以尝试使用二分查找实现(非递归):/** * 二分查找,找到该值在数组中...原创 2019-02-20 22:45:57 · 86 阅读 · 0 评论 -
java内存模型
Java的内存模型图:第一、程序计数器(PC) 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来取下一条需要执行的字节码指令,分支、跳转、循环、异常处理、线程恢复等基础功能都需要这个计数器来完成。 若线程正在执行的是java方法,PC存储的是的当前线程...原创 2019-03-09 20:26:35 · 103 阅读 · 0 评论 -
Java中equals和==的区别
java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 对于基本类型来说,他们存储在jvm的栈中,他们之间的比较,应用双等号(==),比较的是变量的内容,也就是比较的变量的值。2.引用数据类型,包括类,数组,接口 对于引用类型来说,因为对象内容存储在jvm的堆中,...原创 2019-03-20 12:09:43 · 84 阅读 · 0 评论 -
多数投票算法(Boyer-Moore Algorithm)
多数投票算法(Boyer-Moore Algorithm)详解写在前面:在刷LeetCode 169 时碰到了这个问题,并且在评论区找到了这个方法,不过发现CSDN上对其进行解读的博客大多停留在知其然而不知其所以然的层面,所以准备在此做一个较为详细的解读,重点在于介绍其原理。问题描述给定一个无序数组,有n个元素,找出其中的一个多数元素,多数元素出现的次数大于⌊ n/2 ⌋,注意数组...转载 2019-07-19 21:40:15 · 504 阅读 · 0 评论 -
[LeetCode]1. Two Sum 两数之和
题目: 给定一个整数数组 nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路:方法一:暴力法 暴力法很简...原创 2019-07-10 10:30:56 · 162 阅读 · 0 评论 -
常见数据结构的查找、插入、删除时间复杂度
访问 查找 插入 删除 数组 O(1) O(n) O(n) O(n) 有序数组 O(1) O(logn) O(n) O(n) 链表 O(n) O(n) O(1) O(1) 有序链表 O(n) O(n) O(n) O(n) 二叉树查找树 O(logn)...原创 2019-07-04 15:49:51 · 5782 阅读 · 2 评论 -
剑指offer-- 构建乘积数组
题目 给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路 无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。 考虑到计算每个B[i]时都会有重复,思考B[i]之间的联系,找出规律,提高效率。 如上图...原创 2019-07-09 10:35:22 · 118 阅读 · 0 评论 -
树:
二叉查找树(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉查找树和堆的区别1、结构上:二叉排序树:左子树小于根节点,根节点又小于右子树。堆(大堆):根节点大于左右子树,但是左右子树没有大小...原创 2019-07-03 10:53:16 · 99 阅读 · 0 评论 -
剑指offer-- 旋转数组的最小数字(Java)
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路 数组在旋转之后,分为两部分有序的数组,最小的数处在两个有序数组的边界上,由于数组在一定程度上是有...原创 2019-07-08 13:37:17 · 143 阅读 · 0 评论 -
剑指offer--替换空格
题目 请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。思路 首先要询问面试官是新建一个字符串还是在原有的字符串上修改,本题要求在原有字符串上进行修改。 若从前往后依次替换,在每次遇到空格字符时,都需要移动后面O(n)个字符,对于含有O(n)个空格字符的字符串而言,总的时间效率为O(n2...原创 2019-06-22 16:36:55 · 84 阅读 · 0 评论 -
剑指offer-- 第一个只出现一次的字符
题目 在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。思路 创建哈希表,键值key为字符,值value为出现次数。第一遍扫描:对每个扫描到的字符的次数加一;第二遍扫描:对每个扫描到的字符通过哈希表查询次数,第一个次数为1的字符即为符合要求的输出。 可以使用java中的hashmap,但本题只需要用一个简单的数组即可,由于字符(char)是长...原创 2019-06-21 11:12:37 · 103 阅读 · 0 评论 -
剑指offer--二叉树的下一个结点(Java)
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。思路: 首先自己在草稿纸上画图,进行分析(不再展开)。可以发现下一个结点的规律为: 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点; 2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其...原创 2019-02-26 14:37:26 · 125 阅读 · 0 评论 -
剑指offer--反转链表(Java)
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思路: 方法一:使用三个指针(l,cur,r)进行实现(cur为当前遍历到的节点,l为cur的前一个节点,r为cur的后一个节点)。令cur指向l,r则是用于防止链表断裂 注:当前节点从head开始 方法二(递归):找到最后一个结点作为返回值,递归函数中,找到最后的头结点后,开始进行每个结点next...原创 2019-02-26 10:54:18 · 152 阅读 · 0 评论 -
剑指offer---从上往下打印二叉树(Java)
题目:(一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。(二)从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。(三)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。考点:举例让抽象问题具体化,树的遍历思路:(一)不分行从上...原创 2019-02-26 10:09:53 · 161 阅读 · 0 评论 -
Java接口中的成员变量为何必须是public static final
在interface里面定义的属性都是public static final 的。所以你可以这样写:public static final int i=10;或则int i=10;(可以省略掉一部分)注意在声明的时候要给变量赋予初值解释:首先你要弄清接口的含义.接口就是提供一种统一的’协议’,而接口中的属性也属于’协议’中的成员.它们是公共的,静态的,最终的常量.相当于全局常量....转载 2018-09-02 16:41:21 · 684 阅读 · 0 评论 -
Map.Entry使用
Map.Entry说明●Map是java中的接口,Map.Entry是Map的一个内部接口。●Map提供了一些常用方法,如keySet()、entrySet()等方法 keySet()方法返回值是Map中key值的集合 entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。●Map.Entry是Map声明的一个内部接口,此接口...原创 2018-08-29 22:00:50 · 284 阅读 · 0 评论 -
MVC架构原理
MVC是一种架构设计模式,是一种设计理念。是为了达到分层设计的目的,从而使代码解耦,便于维护和代码的复用。MVC是3个单词的缩写,全称:Model-View-Controller(模型-视图-控制器)。举一个例子,MVC就好比我们的鞋柜。当没有鞋柜的时候,鞋子是这样摆放的:有了鞋柜之后,我们的鞋子是这样摆放的:一眼就能看出,有了鞋柜之后,鞋子的摆放明显的整齐和有序很多,这样也很...转载 2018-08-31 22:04:10 · 1537 阅读 · 0 评论 -
MCV架构实例
MVC 模式MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。 View(视图) - 视图代表模型包含的数据的可视化。 Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型...转载 2018-08-31 16:38:37 · 1379 阅读 · 0 评论 -
java对象POJO和JavaBean的区别
POJO"Plain Ordinary Java Object",简单普通的java对象。主要用来指代那些没有遵循特定的java对象模型,约定或者框架的对象。POJO的内在含义是指那些:有一些private的参数作为对象的属性,然后针对每一个参数定义get和set方法访问的接口。没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。public class B...转载 2018-08-31 15:23:24 · 101 阅读 · 0 评论 -
Maven通俗讲解
本片文章面向Maven初学者,希望能让其以最快的速度了解Maven并享受到它所带来的一系列好处。[一个简单的问题] 在进行讲解前,先提问一个简单的问题。 假如你正在Eclipse下开发两个Java项目,姑且把它们称为A、B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 笔者在使用Maven前是这样做的,将B项目打包为jar,并在...转载 2018-08-08 21:42:24 · 98 阅读 · 0 评论 -
Java中的static关键字解析
原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题。以下是本文的目录大纲: 一.static...转载 2018-06-10 15:57:26 · 98 阅读 · 0 评论 -
JAVA中this的三种用法的详解
this关键字必须放在非静态方法里面this关键字代表自身,在程序中主要的使用用途有以下几个方面:①使用this关键字引用成员变量②使用this关键字在自身构造方法内部引用其它构造方法③使用this关键字代表自身类的对象④使用this关键字引用成员方法1 引用成员变量在一个类的方法或构造方法内部,可以使用“this.成员变量名”这样的格式来引用成员变量名,有些时候可以省略,有些时候不能省略。首先看...转载 2018-06-09 17:19:41 · 222 阅读 · 0 评论 -
JavaEE 三层架构
概念三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。表现层(user interface layer):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问...原创 2018-09-05 16:35:07 · 1608 阅读 · 0 评论 -
Java中的多态(来源与教材)
1多态性( Polymorphism)1.1 多态性的概念 多态性是面向对象方法的三个重要特性之一。多态是指在一个程序中相同的名字可以表示不同的实现。 Java 的多态性主要表现在三个方面,①方法重载:指可在一个类中定义多个名字相同而实现不同的成员方法,它是一种静态多态性,或称编译时多态;②方法覆盖(重写),即子类可以隐藏与父类中的同名成员方法,它是一种动态多态性,或称运行时多态...原创 2018-09-03 11:10:53 · 1188 阅读 · 0 评论 -
剑指offer--数组中只出现一次的两个数字(Java)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:记住:两个相同的数字异或等于0. 如果数组中只有一个数字只出现一次,我们从头到尾异或每个数字,那么最终的结果刚好是那个只出现一次的数字。 而本题里数组中有两个数字只出现一次,如果能够将数组分为两部分,两部分中都只有一个数字只出现一次,...原创 2019-02-20 15:42:59 · 561 阅读 · 0 评论 -
剑指offer算法部分
递归和循环:递归:定义:在一个函数的内部调用这个函数自身 优点:代码简洁 缺点:1.函数调用有时间和空间的开销,空间上:在内存栈中分配空间以保存参数,返回地址以及临时变量;时间上:数据的弾入和弹出都需要时间 2.递归中可能很多计算都是重复的(递归的本质是把一个问题分解成两个或多个问题),小问题存在相互...原创 2019-02-20 11:47:51 · 85 阅读 · 0 评论 -
剑指offer--在O(1)时间删除链表结点(Java)
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路: 通常那样从头开始查找删除需要的时间为O(n) 要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j。 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历;2....原创 2019-03-01 10:39:03 · 332 阅读 · 0 评论 -
剑指offer--两个链表的第一个公共结点(Java)
题目:输入两个链表,找出它们的第一个公共结点。思路:蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O(m*n),效率低,注意新一轮循环要将链表指向头部; 使用栈:由于公共结点出现在尾部,所以用两个栈分别放入两个链表中的结点,从尾结点开始出栈比较。时间复杂度O(m+n),空间复杂度O(m+n)。 利用长度关系:计算两个链表的长度之差,长链...原创 2019-02-28 23:02:16 · 185 阅读 · 0 评论 -
剑指offer---和为S的连续正数序列(Java)
题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。思路: 指针法: 用两个指针small和big分别代表序列的最大值和最小值。令small从1开始,big从2开始。 当从small到big的序列的和小于s时,增加big,使序列包含更多数字;(记得更...原创 2019-02-19 16:50:22 · 127 阅读 · 0 评论 -
剑指offer---合并两个排序的链表(Java)
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。思路:1.递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现,当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接。 2.非递归实现:非递归实现比较容易想到,直接进...原创 2019-02-18 21:59:45 · 236 阅读 · 0 评论 -
常用排序算法总结
前言:一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。常见的排序算法有8种:排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) ...原创 2019-02-22 15:15:08 · 153 阅读 · 0 评论 -
java多态的理解(运行时多态)
说道多态,一定离不开其它两大特性:封装和继承。而多态是在它们的基础之上表现而来的,息息相关。在记忆中,每一次学习面向对象的时候,都与这三大特性有扯不开的关系,其是面向对象的重点,当然也算是难点。但是,它们就像是一层窗户纸,只要有一个缝隙,你就完全可以搞懂什么是面向对象。下面来看看关于多态的一些介绍吧:是什么?文学角度:一千个读者就有一千零一个哈姆雷特;公司主管角度:老板交代下来相同任务...转载 2018-09-03 15:40:01 · 25349 阅读 · 15 评论