自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

我的酒馆,名叫夜未央

在这里,拾起你心中的所有回忆

  • 博客(49)
  • 收藏
  • 关注

原创 mysql学习小记(一)-关键字的执行顺序

在编写与分析sql的时候,关键字的执行顺序至关重要。这里整理关键字的执行顺序如下:fromonjoinwheregroup byhavingselectdistinctunionorder by

2020-07-07 15:32:54 144

原创 Redis知识小记

一、单线程的redis为什么这么快?1、Redis的所有操作都在内存中;2、Redis是单线程的,避免了线程上下文切换引起的额外性能开销。同时,单线程避免了多线程的数据同步问题,没有加锁释放锁操作;3、数据结构简单,对数据结构的操作也简单;4、使用多路复用IO(类似java的NIO),多路是指多个网络连接,复用是指多个网络连接复用同一个处理线程,处理线程会依次轮询有IO操作的请求,...

2020-01-21 17:28:01 146

原创 虚拟机字节码执行引擎随记(三)动态类型语言支持

什么是动态类型语言? 类型检查的主体过程是在运行期的语言就是动态类型语言。如JavaScript。 相对的,类型检查的主体过程在编译期的语言是静态类型语言。如Java。从定义中可以看出决定一个语言是不是动态语言有关键两点: 1、类型检查; 2、进行类型检查的时期,在运行期的是动态类型语言,反之在编译期检查的是静态类型语言。为了更形象的理解这个概念,我们不妨来看下面这...

2019-11-15 14:22:23 145

原创 虚拟机字节码执行引擎随记(二)方法重写与动态分派的关系

先看下面这一段代码:public class DynamicDispatching { abstract class Animal{ abstract void run(); } class Cat extends Animal{ @Override void run() { System....

2019-11-05 17:14:38 130

原创 虚拟机字节码执行引擎随记(一)方法重载与静态分派的关系

首先,我们先看下下面这段简单的代码: static abstract class Human { } static class Man extends Human { } static class Woman extends Human { } public void say(Human human) { Syste...

2019-11-04 10:16:09 138 1

原创 TCP三次握手/四次挥手

1.1 三次握手:1.2 四次挥手

2019-10-18 09:59:40 90

原创 mysql数据库事务

mysql数据库事务遵循四大原则:ACID。即:1、原子性(atomicty)事务内的操作要么全部执行,要么全部不执行。2、一致性(consistence)事务执行前后都会保持一个一致性状态,即从一个一致性状态变为另一个一致性状态。如执行A像B转账1000,执行前A有2000块,B有1000块,总数3000,执行后A有1000,B有2000,总数3000。3、隔离性(isola...

2019-04-12 11:08:50 653

原创 java类加载机制

类加载总共分为以下几步:1、加载(loading);2、验证(verification);3、准备(preparation);4、解析(resolution);5、初始化(initialization);6、使用(using);7、卸载(unloading)其中2/3/4步统称为连接(linking)。加载阶段和连接阶段的部分内容是交叉进行的,有可能加载阶段尚未完成,连接阶段就已经开始。但...

2019-04-12 10:34:43 107

原创 JAVA虚拟机(二)内存溢出

一.JAVA堆内存溢出:首先,需要确定发生的是内存溢出(Memory overflow)还是内存泄漏(Memory Leak)。如果是内存泄漏,可以查看泄露对象到GC Roots的引用链,就能找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾回收机制无法自动回收这些对象的;如果不存在内存泄漏,就是内存中这些对象确实还必须存活着,那就检查虚拟机的堆参数,与物理机的内存进行比较...

2018-08-28 14:54:20 156

原创 JAVA并发编程(二)

一.可见性:读操作能实时的看到写操作最新写入的值。在单线程中,读操作总能得到写操作写入的值;但在多线程中,如果读操作跟写操作在不同的线程中执行,那么读操作将不一定能适时的看到其他线程写入的值。二.重排序:在没有使用同步的情况下,编译器/处理器/运行时都有可能做操作的执行顺序进行一些调整。三.volatile关键字,当把变量声明为volatile类型后,编译器与运行时都会注意到这个变...

2018-08-27 20:43:12 130

原创 JAVA虚拟机(一)内存管理

一.内存分配。java虚拟机在运行的时候,将会包含以下运行时数据区域:1.线程私有的部分:程序计数器:可以看成是当前线程所执行字节码的行号指示器。字节码解释器就是通过改变这个计数器的值来确定下一条字节码指令。虚拟机栈:虚拟机栈为虚拟机使用的java方法(也就是字节码)服务。用于存储局部变量表,操作数栈,动态链接,方法出口等信息。局部变量表存放了基本数据类型(short,int,fl...

2018-08-23 00:05:08 390

原创 JAVA并发编程(一)

线程安全性:当多个线程访问某个类的时候,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。无状态对象(即这个类不包含任何域也不包含任何对其他类中域的引用)一定是线程安全的。竞态条件:当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。内置锁:每个java...

2018-07-21 20:44:56 315

原创 给定K个整数,找出由这K个整数组成的最小的数字

思路:先找出这几个整数元素所有的全排列,然后比较哪一个最小即可,全排列的求法可以看我的这篇博客:http://blog.csdn.net/zx582727090/article/details/52171084代码如下:import java.util.ArrayList;import java.util.TreeSet;public class Solution { publi

2016-08-11 13:16:15 712

原创 给定一个非负整数n,统计1~n中所有数中1出现的次数

思路:遍历1~n的所有数,把每个数都转为char数组,然后看1在数组中出现的次数,统计返回即可。代码如下:public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int count = 0; for(int i=1;i<=n;i++){

2016-08-10 17:47:09 2878

原创 给定一个数组,找出这个数组最大连续子数组的和

将这个连续子数组分为两部分,一个是前缀,一个是后一个元素,要使这个连续子数组最大,那么它的前缀肯定不能为负,不然这个前缀对即将加上的值就无意义,用一个max记录最大值,每次当前缀加上后一个元素的时候判断和是否大于max,大于则更新max,再判断和是否小于0,小于0则将前缀更新为0,继续加下一个元素,依次类推,直到数组末尾,max即为最大子数组和。代码如下:public class So...

2016-08-10 17:13:03 3733

原创 找出一个数组中最小的K个元素

思路:看到这个题的第一瞬间我就想到了TreeSet,利用TreeSet在插入元素的时候会进行排序这一特性,这道题还有什么难度呢?遍历数组将所有元素存入TreeSet,然后再遍历TreeSet,取出需要的前K个元素即可。代码如下:import java.util.TreeSet;import java.util.ArrayList;public class Solution {

2016-08-10 16:30:31 472

原创 数组中至多有一个出现次数大于数组长度一半元素,找出这个元素

用一个HashMap就可以很简单的解决这个问题,用HashMap的key存储这个元素,用value存储这个元素出现的次数,遍历数组,每遍历到一个数组就把他put进map,在put之前先检查map中是否已有这个元素,有的话取出value并加一,检查是否大于数组的一半,大于则返回这个元素,否则将加一后的value和key存入map。代码如下:import java.util.HashMap;p

2016-08-10 16:02:58 509

原创 利用递归解决全排列问题

什么是排列?一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列。特别地,当m=n时,这个排列被称作全排列。拿字符串举例,就是找出这个字符串的所有元素组成的所有不同的序列,注意,这些序列具有唯一性,所以就要仔细考虑字符串存在相同元素的情况。abc这样的一个字符串,它的全排列就有:abc、acb、bac、bca、cba、cab不妨

2016-08-10 14:34:36 629

原创 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表

思路:这个算法的难点就难在链表有一个指向随机节点的引用,你不能确定这个引用指向哪一个节点,但是我们可以用选择参照的方式,来解决问题。用原链表作为参照物,head为原链表的某一节点,这个节点的next本来是指向下一个节点的,但是 现在,我们可以把这个next指向复制链表相对于原链表的相应节点headClone,然后再把headClone的next指向head的next,依次类推,到这里已经可以看出规

2016-08-05 16:23:17 2006

原创 给定一棵二叉树,二叉树每个节点的值唯一,从根节点开始找出路径上的所有节点的节点值之和等于规定值的路径

思路:以先序遍历(根节点-左子树-右子树)的方式访问二叉树的每一个节点,记录根节点到遍历到这个节点的所有节点值之和,同时用一个list存储遍历的路径,若节点和等于给定值则返回路径,直到叶子节点,结束递归。用到的数据结构:ArrayList,stack代码如下:import java.util.ArrayList;import java.util.Stack;/**public cla

2016-08-03 13:57:44 6589

原创 判断给出的序列是不是一个二叉搜索树的后序遍历

思路:这个问题其实和给定二叉树的前序(后序)遍历及中序遍历重建二叉树类似,解题的关键点是通过后序遍历找出当前二叉树的根节点,然后根据二叉搜索树左子树小于根节点,右子树大于根节点的特性,我们可以很容易找出根节点的左子树及右子树,然后判断左子树的所有元素是否符和规律,右子树的所有元素是否符和规律,依次递归,直到左子树和右子树为叶子节点,则可认为这个序列的所有元素都符合二叉搜索树的后序遍历的规则。代码如

2016-08-02 16:53:35 1457

原创 打印一棵二叉树,要求从上往下打印,每一层从左往右打印

思路:在二叉树的遍历中,用得最多的就是递归,二叉树的先序、中序、后序遍历都可以用递归实现,但是这里却要使用另外一种方式解决。利用队列先入先出的特性,我们先把二叉树每一层的节点按从左往右的顺序加入队列,然后再让队列中的所有节点一次出栈并打印节点值,此时得到的就是所需的结果。代码如下:import java.util.ArrayList;import java.util.Queue;impor

2016-08-02 15:24:49 1836

原创 给出一个入栈序列和一个出栈序列,判断出栈序列是否是入栈序列对应的出栈序列

注意:在入栈的过程中,并不是所有元素都入栈了之后才出栈,也可能是入栈几个元素,出栈一个或多个,然后再继续入栈,入栈序列只能保证所有元素按规定顺序入栈。思路:利用一个辅助栈和一个指向出栈序列第一个元素的下标(int count = 0;),利用一个循环在入栈的同时就判断当前入栈元素是不是当前下标指向出栈元素,是的话移除栈顶元素,并使下标加一,继续入栈,直到完成入栈序列的遍历。然后判断count是

2016-08-02 13:44:55 2195 2

原创 实现一个可以返回其所存储的最小元素的栈

思路:用两个栈来存储元素,一个用来存储栈的所有元素,一个用来筛选栈的最小元素,利用栈先入后出的思路, 只要入栈的元素小于筛选栈的栈顶元素就将这个元素也压入筛选栈,这样就能保证筛选栈的栈顶元素始终是栈中的最小元素,出栈同理,代码如下:import java.util.Stack;public class Solution { private Stack stackData;

2016-08-01 21:02:09 205

原创 顺时针打印矩阵

思路:找出矩阵的四个顶点,利用递归从外向内依次遍历,直到遍历到矩阵的最里层,结束递归,代码如下:import java.util.ArrayList;public class Solution { public ArrayList printMatrix(int [][] matrix) { ArrayList result = new ArrayList<>();

2016-08-01 17:38:47 190

原创 给定一棵二叉树,找出这棵二叉树的镜像

思路:什么是二叉树的镜像?仔细观察其实可以发现,二叉树的镜像其实就是原二叉树所有节点的左右子树互相交换后的结果,所以可以用一个递归来解决问题,依次递归二叉树的所有节点,然后交换这个节点左右子树,直到根节点,代码如下:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right

2016-07-12 17:08:38 519

原创 大话算法之归并排序

归并排序的核心思想是分治法,将一个需要排序的数组分成很多个部分,使每一部分分别有序之后再合并两部分,最后整个数组就会是一个有序的数组。算法设计采用两部分解决,一部分将数组分成两部分,递归直到子数组只有一个元素,另一部分负责合并两个子数组,从两个子数组第一个元素开始遍历,选取小的一个作为合并好的数组的第一个,第二次比较被选取了元素的数组的第二个元素和另一个数组的第一个元素,以此类推,直到两个子数

2016-06-06 17:12:41 373

原创 判断一棵二叉树是不是另一棵二叉树的子树

定义:父树包含子树的所有节点,注意,空树不是任何数的子树。父树:A 子树:B解法:用递归来实现,从A树的根节点开始,判断其所有的节点是不是依次和树B相同,如不同,递归调用函数,继续判断树A当前节点的左子树的所有节点或右子树的所有节点是否和树B所有节点相同,直到遍历到父树A的叶子节点,如果不是完全相同,则树B不是树A子树,如果直到遍历到树B的叶子节点,其所有节点在树A中均有,则树B是树A

2016-06-04 16:33:37 2350

原创 合并两个排序的链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路1:将两个链表的所有元素按顺序放在一个list里面,遍历list,每次取出list里面val值最小的一个节点放入一个数组,并从list中删除这个节点,数组里依次存放的就是满足单调不减的新链表。/*public class ListNode { int val; ListNode

2016-05-23 15:00:12 291

原创 输入一个链表,反转链表后,输出链表的所有元素。

思路:遍历链表,将链表的所有元素存入一个栈中,从栈中取出元素时,依次得到的就是原链表从尾到头的节点。代码如下:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.Sta

2016-05-20 21:05:23 3995

原创 返回链表中倒数第k个结点

思路:从第一个节点开始遍历,将当前节点以及当前节点前面K-1个节点存储在一个容量为k的数组中,每往后遍历一个节点,便将数组中所有节点前移一位,并将当前节点存储在数组的最后一个位置,当遍历到的节点为Null时,数组中的第一个节点就是链表的倒数第K个节点,代码如下:/*public class ListNode { int val; ListNode next = null;

2016-05-19 21:42:25 317

原创 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:遍历数组,将数组中的所有奇数按顺序存在链表一中,将所有偶数按顺序存在链表二中,遍历链表一将其所存储的所有奇数值赋值给数组的前半部分,遍历链表二将其所存储的所有偶数值赋值给数组的后半部分,代码如下:impor

2016-05-19 21:02:54 227

原创 二进制原码,反码,补码总结

原码:在二进制数据最高位的左面加上一个0或者1来代表符号,1代表负数,0代表正数正数的原码=反码=补码,负数如下:反码:在原码的基础上,除了符号位,其他位均取反,如[11010101010](原码)=[10101010101](反码)补码:在反码的最低位上加一,并依次进位,包括符号位,符号位进位取0,如:[10101010101](反码)=[101010

2016-05-19 20:18:00 912

原创 &&和&,||和|总结,<<和>>位运算符总结

逻辑与:&&只要第一个为false,就不执行第二个条件语句&即使第一个为false,仍然执行第二个条件语句逻辑或||只要第一个为true,就不执行第二个条件语句|即使第一个为true,仍然执行第二个条件语句按位与:&:将两侧数字转换为二进制,比对每一位上的数字是否均为一,均为一返回1,否则为0,如:100110&001010 = 000010

2016-05-19 20:09:45 349

原创 用任意多个个2*1的小矩形,覆盖2*n的大矩形,请问有多少种覆盖的方法?

思路:覆盖最后一格,有一种覆盖的方法,覆盖最后两格,也只有一种覆盖方法,依次递归,直到最后一格或最后两格。代码如下:public class Solution { public int RectCover(int target) { if(target==0){ return 0; }else if(target==1){

2016-05-19 10:35:40 1872

原创 变态版跳台阶

青蛙一次可以跳N个台阶思路:青蛙可以从n-1阶、n-2阶、n-3阶......2阶、1阶、0零阶跳上来,代码如下:public class Solution { public int JumpFloorII(int target) { int jump = 0; if(target==0){ //从第0阶跳上来 ret

2016-05-18 22:07:03 361

原创 一只青蛙一次只能跳一阶或两阶台阶,总共要跳n阶,求总共有多少总跳法

思路:对于第n阶,只能从n-1或者n-2阶跳上来,故只能是这两种,对于第n-1阶,又只能从n-2或者n-3阶跳上来,故用一个递归,直到第二阶或第一阶,实现代码如下:public class Solution { public int JumpFloor(int target) { if(target<=0){ return 0;

2016-05-18 20:34:33 3471

原创 斐波那契数列

第一项为0,第二项为1,以后的每项为前两项之和,代码如下:public class Solution { public int Fibonacci(int n) { int first = 0; int second = 1; if(n==0){ return first; }

2016-05-18 20:10:56 306

原创 旋转数组的最小数字(非递减数组)

思路:1、数组为空;2、数组第一个为最小元素;3、第一个比前面一个元素小的元素 代码如下public class Solution { public int minNumberInRotateArray(int [] array) { if(array.length==0){ return 0; } int min =

2016-05-18 19:36:24 355

原创 用两个栈实现队列

队列:先进先出栈:先进后出,后进先出要点:让一串数据依次出入两个栈之后,恰好就是队列取出插入数据的顺序思想:执行push操作时,将数据压入第一个栈,执行pop操作时,先检查第二个栈是否为空,不为空,返回栈顶元素,如果为空,依次取出栈一中的元素存入栈二,然后返回栈二栈顶元素。代码如下:import java.util.Stack;public class Solution {

2016-05-18 17:27:28 238

空空如也

空空如也

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

TA关注的人

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