07 2020 档案
摘要:1.1BF算法 其实就是暴力解法,直接双重循环,干就完事了。虽然算不上什么好方法,但是非常简单。对于所有的暴力算法,我们应该思考如何进行优化,比如BF算法,当我们遇到不匹配字符的时候,只能从头的下一个字符开始匹配。这样其实做了很多无用的重复工作。那么我们可以怎样优化呢?下面介绍两种。二者的思想都是避
阅读全文
摘要:1.1 简介 bitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。 1.2基本思想 假如我们有一万个数据 (假设我们这里是int型数据),需要判断重复,简单暴力点双重
阅读全文
摘要:1.1目的 在MySQL很多测试场景,需要人工生成一些测试数据来测试。本文提供一个构造MySQL大表存储过程,可以生成包含用户名,手机号码,出生日期等字段。也可以通过滤重来使得手机号码不重复,模拟现实场景。 1.2说明 以下使用存储过程批量生成包含用户名,手机号,出生日期等字段大表。 该存储过程使用
阅读全文
摘要:1.1题目 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例: 示例: 1.2解答 这种问题一看就知道使用动态规划,子问题也很好找,将一个数分为两部分,要么两个部分都不可分了,要么一个可分,一个不可分。两个都可分的情况可以改成一个可分,一
阅读全文
摘要:1.1概述 HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null键和null值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap是线程不安全的。 #1.2详解 在jdk1.7中H
阅读全文
摘要:1.1概述 在使用HashMap的时候,可能会遇到需要按照当时put的顺序来进行哈希表的遍历。通过上篇对HashMap的了解,我们知道HashMap中不存在保存顺序的机制。本篇文章要介绍的LinkedHashMap专为此特性而生。在LinkedHashMap中可以保持两种顺序,分别是插入顺序和访问顺
阅读全文
摘要:#1.1题目 题中给出一个 n_rows 行 n_cols 列的二维矩阵,且所有值被初始化为 0。要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位置下标 [row_id,col_id];同样编写一个 reset 函数,将所有的值都重新置为 0。尽量最少调用随机函数 M
阅读全文
摘要:1.1题目 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。 1.2解答 很显然是二叉树的遍历问题。遍历每个点然后返回当前点的深
阅读全文
摘要:1.1题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 ⇐100)。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新
阅读全文
摘要:1.1题目 给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。 示例1: 示例2: 1.2解答 很显然只能将所有情况完全遍历一次,将以任意一点为起点的情况全部遍历完,也就是对每个点进行深度优先搜索。
阅读全文
摘要:1.1题目描述 给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。 注意: 数组长度 n 满足以下条件: 1 ≤ n ≤ 1000 1 ≤ m ≤ min(50, n) 示例:nums = [7,2,5,10,8]
阅读全文
摘要:1.1题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: #1.2解答 最开始我是想到将1..n分别作为根节点,其左右的数就是左右子树,那么以n为根节点的树的种类数就等于左子树种类数乘右子树种类数,只需要一个递归调用就能解决问题。然后就是通过构建备忘录表实现空间复
阅读全文
摘要:1.1题目描述 爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝
阅读全文
摘要:1.1题目 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 1.2解答 最简单的方法就是穷举法,将一种走法全部遍历出来,进一步我们可以想怎样聪明一点的遍历。因为你每到一个点的方式最多只有两种,就是
阅读全文
摘要:1.1Cookie机制概述 在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或
阅读全文
摘要:1.1for循环 package ztext; import java.util.Arrays; /** * @author xgj */ public class MyTest { public static void main(String[] args) { int[] oldArray =
阅读全文
摘要:1.1题目描述 给定一个无向图graph,当这个图为二分图时返回true。 如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。 graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。
阅读全文
摘要:1.1题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。 示例 1: 输入: [1,3,5] 输出: 1 输入: [2,2,2,0,1] 输
阅读全文
摘要:1.1概述 基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数; 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的
阅读全文
摘要:1.1概述 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。 桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序) 1.2描述 设
阅读全文
摘要:1.1概述 计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。
阅读全文
摘要:1.1概述 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 1.2描述 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区; 将堆顶元素R[1]
阅读全文
摘要:1.1概述 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 1.2描述 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元
阅读全文
摘要:1.1概述 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一
阅读全文
摘要:1.1概述 1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。 1.2描述 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1; 按增量序列个数k,对序列进行k 趟排序;
阅读全文
摘要:1.1概述 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要
阅读全文
摘要:1.1描述 给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树 。 示例: 1.2解答 这题主要参考的是leetcode高赞回答 1.3代码 public class Solution { public List<TreeNode> generateTrees(int n) {
阅读全文
摘要:MyBatis支持两种参数符号,一种是#,另一种是$。比如: <select id="queryAll" resultMap="resultMap"> SELECT * FROM NEWS WHERE ID = #{id} </select> <select id="queryAll" result
阅读全文
摘要:1.1 下载git 首先去官网下载git。 1.2安装 没有特别需求,就保持默认选项 (点next) 选择文件安装路径 例如:D:\github\Git 直到点击 install 后结束。 1.3配置 1.3.1本地配置 开始菜单找到git bash,单击运行即可 输入ssh-keygen -t r
阅读全文
摘要:1.1题目 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而
阅读全文
摘要:1.1概述 表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了。 1.2描述 初始状态:无序区为R[1..n],有序区为空。 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[
阅读全文
摘要:题目 有n个气球,编号为0到n-1,每个气球上都标有一个数字,这些数字存在数组nums中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注
阅读全文
摘要:1.1概述 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.2描述 比较相邻的元素。如果
阅读全文
摘要:题目 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例1: 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" 输出: true 示例2: 输入: s1 = "aabcc", s2 = "dbbca",
阅读全文
摘要:1.1GC概述 垃圾回收是一种自动的存储管理机制。 当一些被占用的内存不再需要时,就应该予以释放,以让出空间,这种存储资源管理,称为垃圾回收(Garbage Collection)。 垃圾回收器可以让程序员减轻许多负担,也减少程序员犯错的机会。 1.2GC执行时机 GC触发的条件有两种: (1)程序
阅读全文
摘要:程序计数器 每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。保存下一条将要执行的指令地址。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地
阅读全文
摘要:1.1概述 被native关键字修饰的方法叫做本地方法,本地方法和其它方法不一样,本地方法意味着和平台有关,因此使用了native的程序可移植性都不太高。另外native方法在JVM中运行时数据区也和其它方法不一样,它有专门的本地方法栈。native方法主要用于加载文件和动态链接库,由于Java语言
阅读全文
摘要:1.1定义 JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。 1.2流程 如图所示,当jvm要加载.class的时
阅读全文
摘要:1.1概述 被final修饰的类不可以被继承 被final修饰的方法不可以被重写 被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.被final修饰的方法,JVM会尝试将其内联,以提高运行效率 被final修饰的常量,在编译阶段会存入常量池中. 1.2引入 观
阅读全文
摘要:1.1作用 防止指令重排 使得多线程下的共享资源能够独自修改使用。解决缓存不一致问题。 1.2相关知识 1.Java内存模型 1.3详解 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1.保证了不同线程对这个变量进行操作时的可见性,即一个线程修
阅读全文
摘要:1.1定义 在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。那么Java内存模型规定了哪些东西呢,它定义了程序中变量的访问规则,往大一点说是定义了程
阅读全文
摘要:1.1定义 当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。 举个简单的例子:i = i +1。当线程执行这个语句时,会先从主存当中读取i的值,然后复
阅读全文
摘要:1.1定义 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。这里存在一种设计思想,不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。注意这里和适配器模式的区别,前者是需要对原代理类的进行功能上的扩
阅读全文
摘要:1.1模式定义 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装(Wrapper)。适配器模式既可以作为类结构型模式(继承关系),也可以作为对象结构型模式(关联关系)。 1.2角色 Target:目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
阅读全文
摘要:1.1概念 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。需要实现Cloneable接口,重写clone()方法。 //克隆过程内部的数组和引用对象不会拷贝,其他的原始基本类型和String类型会被拷贝。 //方法一:重写clone方法,将对象的所有属性都手动克隆一下。 //方法二:
阅读全文
摘要:1.1什么是建造者模式 创建者模式又叫建造者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。 指挥者(Director)直接和客户(Cli
阅读全文
摘要:1.1模式定义 保证一个类只有一个实例,并且提供一个全局访问点。最重要的就是保证构造器私有。 1.2实现方式 1.2.1懒汉模式 public class LazySingleton { private static LazySingleton instance; //构造器私有 private L
阅读全文
摘要:## 1.1简单工厂模式 定义了一个创建对象的类,由这个类来封装实例化对象的行为。比如一个pizza工厂一共生产三种类型的pizza:chesse,pepper,greak。通过工厂类(SimplePizzaFactory)实例化这三种类型的对象。 public class SimplePizzaF
阅读全文
摘要:概要: i++ 返回原来的值,++i 返回加1后的值。 JAVA中: java的编译器在遇到i和i--的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉。下面展示j=i的过程: java中二者都只能作为右值,不能作为左值。 C++中: i++ 不能作为左
阅读全文

浙公网安备 33010602011771号