自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指offer——二叉搜索树的第k个节点

题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。题解:中序遍历即可/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/i..

2020-07-28 21:33:03 81

原创 剑指offer——二叉搜索树的后序遍历序列

题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题解:本题是利用递归思想,判断根节点的左子树元素是否小于根节点,右子树元素是否大于根节点。重点在于对左右子树的划分(因为传入的是个数组)1.从第0位开始,找到第一位比根节点大的元素,记录此位置i。在此位置之前都属于左子树(此时已经断定左子树都小于根节点)2.检查右子树是否都大于跟节点(从第i位开始,到根节点前)3.判断左右子树是否都属于二叉搜索

2020-07-28 21:16:54 96

原创 JMM(Java内存模型)

JMM概述:Java内存模型是Java Memory Model(JMM)的意思简单的说,JMM定义了一套在多线程读写共享数据时(成员变量、数组)时,对数据的可见性、有序性、和原子性的规则和保障;JMM-原子性-synchronized:更换了synchronized的位置之后,进行优化处理,减少了加锁解锁的处理...

2020-07-26 13:58:02 200

原创 Java教程Spring框架开发——第三天

基于aspecj的注解aop操作: 创建对象在spring核心配置文件中,开启AOP操作在增强类上使用注解完成AOP操作测试:Spring的jdbcTemplate操作:1、spring 框架—站式框架针对javaee三层,每一层都有解决技术 在dao层,使用jdbcTemplate2、spring对不同的持久化层技术都进行了封装jdbcTemplate对jdbc进行封装3、jdbcTemplate和dbutils使用很相似,都对数据库进行...

2020-07-25 21:43:51 145

原创 Java教程Spring框架开发——第二天

spring的bean管理注解准备:代码里面持殊标记,使用注解可以完成功能 注解写法@注解名称(属性名称-属性值) 注解使用在类上面,方法上面和属性上面Spring注解开发准备:导入jar包: 1、导入基本的jar包 2、导入aop的jar包 创建类,创建方法 创建Spring的配置文件,引入约束第一天做 ioc 基本功能,引入约束beans 做spring 的 ioc 注解开发,引入新的约束 开启注解的扫描...

2020-07-25 19:53:23 101

原创 Java教程Spring框架开发——第一天

Spring概念:1、Spring是一个开源的轻量级框架,即是免费的提供源码的不需要依赖其他组件的框架;2、Spring是一个一站式的框架;web层:springMVC service层:spring的IOC dao层:spring的jdbcTemplate3、Spring核心主要是两部分:AOP:面向切面编程,扩展功能不是通过修改源代码实现; IOC:控制反转 |- 创建类对象的过程,需要new出来对象,比如有一个类,类里面有方法(不是静态的方法),调用类里面的方法,...

2020-07-25 15:09:27 281

原创 剑指offer——滑动窗口的最大值

题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2

2020-07-24 21:09:22 69

原创 剑指offer——二维数组中的查找

题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。方法一:public class Solution { public boolean Find(int target, int [][] array) { for(int i = 0; i < array.length; i++){ for(i

2020-07-24 20:36:49 63

原创 剑指offer——替换空格

题目描述请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。方法一:public class Solution { public String replaceSpace(StringBuffer str) { return str.toString().replaceAll(" ", "%20"); }}方法二:public class Solu

2020-07-24 19:56:54 55

原创 剑指offer——从尾到头打印链表

题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayList;public class Solution {

2020-07-24 19:37:40 53

原创 剑指offer——调整数组顺序

题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题解:原数组分成一个奇数组一个偶数组,再按顺序复制回去,这样,只需要遍历两次原数组即可public class Solution { public void reOrderArray(int [] array) { int[] arrayOdd = new int[array.length];

2020-07-24 15:42:07 62

原创 剑指offer——把数组排成最小的数

题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。题解:比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。import java.util.ArrayList;import java.util.*;public class Solu

2020-07-24 15:08:24 77

原创 剑指offer——第一个只出现一次的字符

题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)public class Solution { public int FirstNotRepeatingChar(String str) { if(str == null){ return -1; } int[] co

2020-07-24 14:42:37 56

原创 剑指offer——包含min函数的栈

题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。题解这里也是使用了两个栈。一个用来存所有的元素“stackTotal”,另一个用来存加入新的元素后当前stackTotal中对应的最小值。两个栈中的元素数量始终保持一致,当新的元素小于“stackLittle”栈顶元素时,“stackLittle”像栈顶push新来的元素,否则,“stackLittle”向栈顶加入原栈顶元素。执行“pop”方法时,两个栈同时弹出各自的栈顶元素。i

2020-07-21 19:30:26 72

原创 LeetCode——1470. 重新排列数组

方法一:蛮力法class Solution { public int[] shuffle(int[] nums, int n) { int[] nums2 = new int[n]; int[] ret = new int[2 * n]; int a = 0; int b = 0; for(int i = 0; i < ret.length; i++){ if(i % 2 == 0)

2020-07-21 16:32:03 139

原创 LeetCode——1512. 好数对的数目

方法一:蛮力法class Solution { public int numIdenticalPairs(int[] nums) { int count = 0; for(int i = 0; i < nums.length; i++){ for(int j = i + 1; j < nums.length; j++){ if(nums[i] == nums[j]){

2020-07-21 16:09:18 111

原创 LeetCode——1480. 一维数组的动态和

题解:动态规划方程写出即可;class Solution { public int[] runningSum(int[] nums) { int[] sum = new int[nums.length]; sum[0] = nums[0]; /*if(nums.length == 0 || nums.length == 1){ return nums; }*/ for

2020-07-21 15:35:41 112

原创 剑指offer——重建二叉树

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题解利用前序序列根节点在前找到根节点,用根节点去中序序列划分成两部分,左部分是左子树,右部分是右子树。再利用子树长度去前序序列把前序序列中的左右子树找出来,同时可以找出根节点。递归进行此步骤,如果子树长度为0,则不需要生成子问题。class Tree

2020-07-21 15:14:38 80

原创 剑指offer——数据流中的中位数

题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。题解:使用无序数组,主要为了体现思路,所以直接调用库的排序方法import java.util.*;public class Solution { ArrayList<Integer&g

2020-07-21 14:37:46 65

原创 剑指offer——二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。题解:中序遍历二叉树,然后用一个ArrayList类保存遍历的结果,这样在ArratList中节点就按顺序保存了,然后再来修改指针;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(i

2020-07-21 14:16:19 66

原创 Java面试必备——Java虚拟机优化

SpringIOC中,控制反转是目的,依赖反转是手段,IOC容器用于控制对象,通常用于解耦,因为需要的时候就要创建对象,然后由对象去调用对应的方法属性等;Java虚拟机优化:案例: 该程序的整个运行流程:main函数在运行前会在栈、本地方法栈、程序计数器等等地方开辟一个空间用于存储;...

2020-07-21 13:47:30 230

原创 剑指offer——合并两个排序的链表

题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Merge(ListNode list1,ListNode li

2020-07-21 09:35:58 95

原创 剑指offer——栈的压入、弹出序列

题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)题解新建一个栈,将数组A压入栈中,当栈顶元素等于数组B时,就将其出栈,当循环结束时,判断栈是否为空,若为空则返回true.import java.util.ArrayList;imp

2020-07-20 21:26:13 67

原创 剑指offer——和为S的连续正数序列

题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序链接:https://www.nowcode

2020-07-20 21:01:09 82

原创 Spring视频教程——Servlet容器

Servlet容器Servlet容器是管理servlet对象的。Servlet容器的作用:负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。使用Servlet容器的原因: 通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等 等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apach..

2020-07-20 20:31:05 127

原创 剑指offer——求1+2+...+n

题目描述求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。题解:if (n==1) return 1; 也就是说如果n==1,需要终止递归,所以我们想到了逻辑与&&连接符。A&&B,表示如果A成立则执行B,否则如果A不成立,不用执行B因此我们可以这样。在n>1的时候,执行递归函数。public class Solution { public...

2020-07-20 11:34:24 90

原创 剑指offer——用两个栈实现队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题解:两个栈,栈一用于存储元素,栈二用于弹出元素,当栈二为空的时候,将栈一中的元素放入栈二中,然后在栈二中弹出栈顶元素。所以最后总结一下:push操作就直接往stack1中push, pop操作需要分类一下:如果stack2为空,那么需要将stack1中的数据转移到stack2中,然后在对stack2进行pop,如果stack2不为空,直接pop就ok。import java.util.Stack;

2020-07-20 11:21:06 94

原创 剑指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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)import java.util.ArrayList;public class Solution { public int[]

2020-07-20 11:05:45 69

原创 剑指offer——变态跳台阶

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题解:设f[i] 表示当前跳道第 i 个台阶的方法数。那么f[n]就是所求答案。假设现在已经跳到了第 n 个台阶,那么前一步可以从哪些台阶到达呢?如果上一步跳 1 步到达第 n 个台阶,说明上一步在第 n-1 个台阶。已知跳到第n-1个台阶的方法数为f[n-1]如果上一步跳 2 步到达第 n 个台阶,说明上一步在第 n-2 个台阶。已知跳到第n-2个台阶的方法数为f[

2020-07-20 10:36:58 78

原创 剑指offer——二叉树的镜像

题目描述操作给定的二叉树,将其变换为源二叉树的镜像。实现:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public void Mirror(Tree

2020-07-20 10:23:55 88

原创 剑指offer——不用加减乘除做加法

题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:& 按位与运算:相同位的两个数字都为1,则为1;若有一个不为1,则为0。两个数相与,并左移一位:相当于求得进位  如:1&1=1 将1左移一位变成了10,相当于拿到了进位。^ 按位异或运算:相同位置不同则为1,相同则为0。相当于每一位相加,而不考虑进位。第一步 异或——无进位相加得result1 (a^b) 第二步 与+左移一位——求得进位result2 (a&b)&lt

2020-07-20 10:17:20 83

原创 剑指offer——二叉树的深度

题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/import java.lang.Mat

2020-07-20 10:00:10 94

原创 类加载

类文件结构:根据JVM规范,类文件结构如下:魔数: 0-3字节,表示它是否是【class】类型的文件 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09版本: 4-7字节,表示类的版本00 34 (52)(16进制)表示是Java 8 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09常量池:8~9字节,表示常量池...

2020-07-19 16:05:37 123

原创 回收算法+分代回收+垃圾回收器

回收算法--标记清除:把对象占用的起始结束地址记录下来,放在一个空闲的地址列表中,下次分配新对象时,将会到这个空闲地址列表中查找有没有足够的空间可以容纳新对象,如果有就进行内存分配,并不会对所占用的地址空间进行清除操作;优点:速度很快,因为只需要对起始结束地址进行记录即可,不需要进行清除操作;缺点:容易产生内存碎片;如果需要创建的是一个连续的数组空间,它会在空闲地址表中查找可以存放的地址空间,但是每一个地址空间都无法进行容纳,不过总的空闲空间很明显可以容纳该新对象,此时就是内存碎片;回收

2020-07-19 13:15:09 196

原创 垃圾回收+五种引用

判断垃圾--引用计数当有引用的时候,引用计数加一,没有引用计数时减一,当引用计数变为0时,将会被当成垃圾进行回收。但是有一个弊端如图:当对象之间相互循环引用时,两者的引用计数都是1,即使没有别的对象对他进行引用,他们也不会被回收,此时就会造成内存上的泄露;Java中没有采用引用计数法,但是早期的python采用过;判断垃圾--可达性分析算法Java中采用可达性分析算法;可达性分析算法中首先要确定根对象,根对象就是那些肯定不能被当成垃圾进行回收的对象;如果一个对象被根对象进行直接或者间

2020-07-19 10:51:12 261

原创 直接内存

直接内存是系统内存;不属于JVM部分直接内存定义常见于NIO操作时,用于数据缓冲区 分配回收成本较高,但读写性能高 不受JVM内存回收管理直接内存的基本使用使用 io 函数进行读写文件后:使用 directBuffer 函数后,运行速度明显变快了;直接内存的出现,使得Java代码和系统内存都可以进行访问,省去了第一张图中分别开辟两块缓冲区内存,如此速度得到了提升;直接内存比较适合做文件的操作;例题:演示直接内存溢出输出36,提示信息:java.lang.outO

2020-07-19 09:42:38 216

原创 StringTable

常量池与串池(字符串池)的关系串池中的对象只会存在一份,如果串池中已经存在,那么将会直接使用,如果不存在,那么到执行这句话的时候再将其加入到串池中,所以说他是懒惰的;字符串的连接原理:此时与S3不相等 此时与S3相等常量字符串拼接原理:javac 在编译期间的优化,结果已经在编译期确定为ab字符串延迟实例化当你编写打印输出1到9个数字时,打印两遍的话,第一遍会把1到9存入串池中,第二遍将不会重复将1到9个数字存入串池中,而是直接在串池中,将这9个数字取出来进行输出操作;..

2020-07-18 21:30:35 161

原创 线程诊断+堆+方法区+常量池

线程诊断案例1: cpu占用过多定位用top定位哪个进程对cpu的占用过高 ps H -eo pid,tid,%cpu | grep进程id(用ps命令进一步定位是哪个线程引起的cpu占用过高) jstack进程id 可以根据线程id 找到有问题的线程,进一步定位到问题代码的源码行号案例2:程序运行很长时间没有结果可能产生了死锁;本地方法栈本地方法栈是给本地方法提供内存空间;堆Heap堆:通过new关键字,创建对象都会使用堆内存特点:它是线程共享的,堆中对象都需要考

2020-07-18 19:40:43 151

原创 程序计数器+栈

程序计数器拿到一个二进制字节码,先将他交给解释器进行解释,然后交给机器码,最后交给CPU进行处理;程序计数器的作用:记住下一条jvm指令的执行地址;程序计数器的特点:是线程私有的;不会存在内存溢出;栈一个栈是由多个栈帧组成的,栈的特点是先进后出; 定义:Java Virtual Machine Stacks(Java虚拟机栈)每个线程运行时所需要的内存,称为虚拟机栈 每个 栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存 每个线程只能有一...

2020-07-18 15:57:45 429

原创 JVM基础

定义:Java Virtual Machine - java程序的运行环境 (java二进制字节码的运行环境)好处:—次编写,到处运行(屏蔽底层的一些差别,可以在Linux系统、windows系统等上面运行); 自动内存管理,垃圾回收功能; 数组下标越界越界检查(如果不小心越界了,可能会覆盖其他代码的内存); 多态:可以扩展很多的功能;比较:jvm:用于屏蔽Java代码与底层操作系统之间的差异;jre:jdk:...

2020-07-18 14:44:15 72

空空如也

空空如也

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

TA关注的人

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