自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【剑指Offer刷题笔记】表示数值的字符串

题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:若干空格一个 小数 或者 整数 (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符(’+’ 或 ‘-’)下述格式之一:至少一位数字,后面跟着一个点 ‘.’至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字一个点 ‘.’ ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:(可选)一个符号

2021-06-20 12:05:53 136

原创 【剑指 Offer】—— 31. 栈的压入、弹出序列

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。题目来源:力扣(LeetCode)思路1.使用一个辅助栈stack模拟元素入栈出栈的过程2.遍历pushed模拟入栈过程,如果在push过程中如果发现stack.peek()==popped[i]说明此时po

2021-06-13 20:03:50 139

原创 【排序】堆排序

介绍堆结构就是用数组实现的完全二叉树结构,也叫做优先级队列结构,堆排序是利用堆这种数据结构而设计的一种排序算法, 堆排序是一种选择排序, 它的最坏, 最好平均时间复杂度均为 O(nlogn), 它也是不稳定排序。堆是具有以下性质的完全二叉树: 每个结点的值都大于或等于其左右孩子结点的值, 称为大顶堆(注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系,)每个结点的值都小于或等于其左右孩子结点的值, 称为小顶堆思路1.首先我们来看构建大顶堆的两个主要方法:heapInsert: 向堆中加入元

2021-06-07 22:25:57 212

原创 【排序】快速排序

介绍快速速排序在每一轮挑选一个基准元素, 并让其他比它大的元素移动到数列一边, 比它小的元素移动到数列的另一边, 从而把数列拆解成两个部分。然后再按此方法对这两部分数据分别进行快速排序, 整个排序过程可以递归进行, 以此达到整个数据变成有序序列问题引入我们先来看两个有关的问题问题一给定一个数组arr, 和一个数num, 请把小于等于num的数放在数 组的左边, 大于num的数放在数组的右边。 要求额外空间复杂度O(1), 时间复杂度O(N)思路1.使用两个变量small(表示小于num区域的

2021-06-03 19:44:54 160

原创 【排序】归并排序

归并排序归并排序(MERGE-SORT) 是利用归并的思想实现的排序方法, 该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解, 而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起, 即分而治之)。1) 整体就是一个简单递归, 左边排好序、 右边排好序、 合并左边和右边让其整体有序2) 让其整体有序的过程里用了外排序方法思路1.主方法merSort将原来的部分分成左边部分和右边部分,对这两部分进行递归,递归完成

2021-06-01 20:29:35 117

原创 【二分法】二分法的常见使用

二分法二分查找在有序数组中查找某个值的时间复杂度是O(logN),但是二分法不一定只能用在有序数组中,对于某些特殊情况的无序数组也可以使用二分查找二分法的常见三种使用情况1) 在一个有序数组中, 找某个数是否存在2) 在一个有序数组中, 找>=某个数最左侧的位置3) 局部最小值问题1.在一个有序数组中, 找某个数是否存在 public static boolean binarySearchExist(int[] arr, int target) { int left

2021-05-31 21:18:54 1472

原创 【排序】三种简单排序算法(冒泡排序、选择排序、插入排序)

冒泡排序1.两两比较,如果前面的数比后面的大,则交换这两个位置上的数,这样每一轮下来都会确定一个剩余数中最大的数,经过n-1轮排序完成(n为元素个数)2.最先排序好的是n-1位置上上面的数,然后是n-2…3.每轮需要比较的数的个数是递减的,因为前面i轮已经排序好i个数这些数不需要进行比较public class Problem02_BubblingSort { public static void bubblingSort(int[] arr) { if (arr == nu

2021-05-31 19:51:21 230

原创 【异或运算】找到出现个数为奇数次的数

找到出现个数为奇数次的数问题1.一种数出现奇数次,其他数都出现偶数次,怎么找到这个出现奇数次的数2.有两个数出现奇数次其他数都出现偶数次,怎么找到这两个数异或技巧int rightOne = xor & (~xor + 1); //提取出最右边的那个1代码public class Problem01_findOdd { public static void main(String[] args) { int[] arr1 = {1, 2, 2, 3, 3

2021-05-31 18:24:09 330

原创 【双指针】——LeetCode26. 删除有序数组中的重复项

题目给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输入:nums = [0,0,1,1,1,2,2,3,3,4]输出:5,

2021-04-17 11:43:26 74

原创 【mysql】——mysql插入中文数据显示?的问题

mysql插入中文数据显示?的问题1.登录mysqlC:\Users\poem>mysql -u root -p2.查看数据库编码格式show variables like 'char%';3.找到my.ini或者my.cnf加入character-set-server=utf84.重启mysql再次查看

2021-04-06 14:24:47 164

原创 【位运算】——LeetCode318. 最大单词长度乘积

题目难度:中等给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。示例 1:输入: ["abcw","baz","foo","bar","xtfn","abcdef"]输出: 16 解释: 这两个单词为 "abcw", "xtfn"。示例 2:输入: ["a","ab","abc","d","cd","bcd","abcd"]

2021-04-04 14:16:43 150

原创 【位运算】——342. 4的幂

题目难度:简单给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true题目来源:力扣(LeetCode)思路1.先判断是不是2的幂次方2.二进制形式有且只有一个位为1并且在奇数位上利用 n & 0b010101010101

2021-04-03 10:38:02 103

原创 【位运算】——LeetCode231. 2的幂

【题目】难度简单298给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false题目来源:力扣(LeetCode)思路如果这个数是 2 的幂次方,那么它的二进制形式有且只有一个位为1方法1:使用Integer.bitCount方法会统计这个数二进制形式下1的个数方法2:利用(n-1)&n==0比如8

2021-04-03 10:19:16 85

原创 【位运算】——不使用额外变量交换两个整数

思路使用异或运算^代码 public static void main(String[] args) { int a = 100; int b = 200; a = a ^ b; b = a ^ b; a = a ^ b; System.out.println("a=" + a); System.out.println("b=" + b); }

2021-04-03 09:46:09 100

原创 【数组与矩阵】——LeetCode769. 最多能完成排序的块

题目难度:中等数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例 1:输入: arr = [4,3,2,1,0]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。例如,分成 [4, 3], [2, 1, 0] 的结果是 [3, 4, 0, 1, 2],这不是有序的数组。示例 2:输入: arr =

2021-04-02 16:56:26 116

原创 【数组与矩阵】——leetcode667.优美的排列 II

leetcode667. 优美的排列 II难度:中等给定两个整数 n 和 k,你需要实现一个数组,这个数组包含从 1 到 n 的 n 个不同整数,同时满足以下条件:① 如果这个数组是 [a1, a2, a3, … , an] ,那么数组 [|a1 - a2|, |a2 - a3|, |a3 - a4|, … , |an-1 - an|] 中应该有且仅有 k 个不同整数;.② 如果存在多种答案,你只需实现并返回其中任意一种.示例 1:输入: n = 3, k = 1输出: [1, 2, 3]解

2021-04-01 16:59:17 103

原创 【JVM】——JVM体系结构图

学习JVM,自己画了一个JVM体系结构图,方便随时复习

2021-03-28 17:49:58 113

原创 【树】——非递归实现二叉树的前序遍历,后序遍历,中序遍历

1. 非递归实现二叉树的前序遍历思路原来用递归的方式是系统来帮我们压栈,现在我们自己创建一个栈来实现1.将栈中节点弹出,加入resList集合(需要返回的那个集合)。2.把被弹出的节点的右子节点和左子节点压入栈中。3.直到栈为空,遍历结束。注意因为是前序遍历所以顺序应该为 root left rightroot 弹出时已经加入resList,因为栈是先进后出,所以右子节点先压栈,左子节点再压栈。题目代码实现class Solution { public List<Integer

2021-03-22 19:44:13 635

原创 【设计模式1】——工厂方法设计模式

工厂方法设计模式介绍定义:工厂方法(Factory Method)模式的意义是定义一个创建产品工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。就是说原来简单工厂设计模式产品的创建必须要核心的一个工厂类来完成,现在把工厂类定义成一个接口,根据产品的需要我们创建具体的工厂类来继承这个核心工厂类,让具体的工厂类来创建产品。这样在要增加新的产品的时候我们只需要增加

2021-03-20 21:35:14 98

原创 【eclipse】——eclipse回车会添加一个大括号的问题

进入Preferences,把Automatically close这四个√的去掉

2021-03-17 09:12:04 569

原创 【maven】——如何将下载的jar包手动导入本地maven仓库

如何将下载的jar包手动导入本地maven仓库1.首先将jar包拷贝到maven仓库的安装路径的bin目录下2.运行cmd命令进入到该目录输入命令 :mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-sdk -Dversion=3.0.0 -Dpackaging=jar -Dfile=alipay-sdk-java20180104135026黑体加粗部分替换成需要导入的jar包的名字。3.导入成功...

2021-03-13 17:00:58 369

原创 【设计原则2】——里氏替换原则

里氏替换原则定义1.通俗来说,子类可以扩展父类的功能,但是不能改变父类原有的功能。2.在程序中将一个父类对象替换成子类对象,程序将不会产生任何错误和异常,反过来不成立。3.它是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,程序中尽量使用父类类型来定义对象,运行时再确立子类类型,用子类对象替换父类对象。里氏替换原则包含的含义1.子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。2.子类可以增加自己特有的方法。3.当子类覆盖或实现父类方法时,方法前置条件(形参)要

2021-03-12 21:34:05 231 1

原创 【设计原则1】——迪米特法则

迪米特法则什么是迪米特法则?迪米特法则(Law of Demeter)又叫作最少知识原则,最少知道原则(The Least Knowledge Principle),一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。是“朋友”的情况1)当前对象本身(this)2)以参量形式传入到当前对象方法中的对象3)当前对象的实例变量直接引用的对象4)当前对象的实例变量如果是一个聚集(比如说List< Node >),那么聚集中的元素也都是朋友5)当前

2021-03-12 00:24:04 132 1

原创 【刷题笔记6】背包问题场景应用(动态规划)

题目牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。思路1.这个实际上就是背包问题的变种,首先建立一张dp表大小为v.length * (w+1)2.填dp表的过程分为三步dp[i][j]表示的是从i前面个零食中选零食,背包容量为j一共有多少种装零食的方法(1)容量为0的时候方法数为1(2)只能选v[0]这一

2021-02-20 10:05:12 614

原创 【刷题笔记4】木棍组成三角形问题(斐波那契数列)

题目在迷迷糊糊的大草原上, 小红捡到了n根木棍, 第i根木棍的长度为i,小红现在很开心。 想选出其中的三根木棍组成美丽的三角形。但是小明想捉弄小红, 想去掉一些木棍, 使得小红任意选三根木棍都不能组成三角形。请问小明最少去掉多少根木棍呢?输入n 返回至少去掉多少根。思路根据斐波那契数列求解,长度等于斐波那契数列中的数的木棍可以保留斐波那契数列 : 0 1 1 2 3 5 8 13例如n=8 那么长度为 1 2 3 5 8的木棍保留,因此至少去掉3根木棍代码实现public class P

2021-02-19 22:03:18 3035

原创 【刷题笔记3】栈的最小值

题目请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> 返回 -3.minStack.pop();minStack.top(); --&

2021-02-18 18:00:34 67

原创 【刷题笔记2】螺旋矩阵

题目用螺旋的方式打印矩阵, 比如如下的矩阵0   1   2    34   5   6    78   9   10  11打印顺序为: 0 1 2 3 7 11 10 9 8 4 5 6思路1.定义两个点分别指向矩阵左上角和右下角两个位置。2.根据p1,p2的行和列的值将一圈分成4块,按顺序

2021-02-17 23:24:14 195 3

原创 【刷题笔记1】给定一个数组arr, 求差值为k的去重数字对

【题目】给定一个数组arr, 求差值为k的去重数字对【解题思路】1.将arr存入一个HashSet的集合中,方便去重复和比较。2.遍历set集合查找集合中是否有当前值加上k值后的值,如果有的话就添加进返回的集合lists中。【代码实现】import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.List;public class Problem01_Subvalu

2021-02-16 11:38:59 377

原创 【打表法】买苹果问题

【题目】小虎去附近的商店买苹果, 奸诈的商贩使用了捆绑交易, 只提供6个每袋和8个每袋的包装包装不可拆分。 可是小虎现在只想购买恰好n个苹果, 小虎想购买尽量少的袋数方便携带。 如果不能购买恰好n个苹果, 小虎将不会购买。 输入一个整数n, 表示小虎想购买的个苹果, 返回最小使用多少袋子。 如果无论如何都不能正好装下, 返回-1。打表法打表就是将所有输入情况的答案保存在代码中,输入数据后直接输出就可以了这个技巧对于一些题目而言能够降低程序的运行时间,降低算法的时间复杂度。满足的特点是输入

2021-02-15 18:41:25 355 3

原创 【双指针】平方数之和

【平方数之和】给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2= c思路双指针,需要注意的是初始化的时候一个指针指向0另一个指针指向c的平方根的位置(取整数值部分) 的位置class Solution { public boolean judgeSquareSum(int c) { int n=(int)Math.sqrt(c); int start=0; int end =n;

2021-02-13 22:35:18 191

原创 【树形DP】 二叉树节点间的最大距离问题

二叉树节点间的最大距离问题【问题】从二叉树的节点a出发, 可以向上或者向下走, 但沿途的节点只能经过一次, 到达节点b时路径上的节点个数叫作a到b的距离, 那么二叉树任何两个节点之间都有距离, 求整棵树上的最大距离。【解题思路】1.以root为头结点,来分析这棵树,有两种情况:(1)这个最大值经过了头结点,这个时候最大距离为左树中离头结点最远的结点到右树中离头结点最远的结点的距离。(2)这个最大值不经过头结点root,那么最大距离就是左树和右树的最大距离较大的那一个。2.构造一个类表示递归过程

2021-02-10 20:50:58 448 2

原创 【数据结构与算法】滑动窗口

滑动窗口可以理解为一个可以容纳n个元素的窗口,通过每次记录窗口的状态,找到符合条件的窗口或者说在窗口中得到符合条件的元素。通过滑动窗口可以减少时间复杂度【题目】有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次 向右边滑一个位置。例如, 数组为[4,3,5,4,3,3,6,7], 窗口大小为3时:窗口滑动过程窗口中的最大值[ 4 3 5 ] 4 3 3 6 754 [3 5 4] 3 3 6 754 3

2021-02-09 22:16:56 240

原创 给你一个栈,不使用额外的数据结构 ,只能使用递归函数,逆序这个栈。

问题:给你一个栈,不使用额外的数据结构 ,只能使用递归函数,逆序这个栈。思路:1.定义一个函数getLastElement得到当前栈的栈底元素2.定义一个函数reverseStack,保存当前栈的栈底元素,并把弹出栈底元素的栈传入reverseStack继续递归调用,直到栈为空返回,把每一层的i压入栈中就实现了栈的逆序。代码实现:import java.util.Stack;public class ReverseStack { public static void main(Str

2021-02-07 17:11:31 270 2

原创 会议室宣讲调度问题

问题:一些项目要占用一个会议室宣讲,同一个时间会议室中只能有一个项目在宣讲。给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目), 你来安排宣讲的日程, 要求会议室进行的宣讲的场次最多。返回这个最多的宣讲场次。知识点:贪心算法解题思路:1.将项目按会议结束时间从小到大排序2.每次选择结束时间最早的项目(如果这个项目的开始时间在前一个项目结束之后)代码实现:import java.util.Arrays;import java.util.Comparator;publ

2021-02-06 18:26:02 153

原创 前缀树

什么是前缀树前缀树又叫单词查找树,Tire树,是哈希树的变种。典型应用于统计,排序和保存大量字符串,经常被搜索引擎系统用于文本词频统计。前缀树的每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符串(不仅限于字符串)。优点:可以利用字符串的公共前缀来减少查询时间,最大限度地减少不必要的字符串比较,查询效率比哈希树高。问题举例一个字符串类型的数组arr1,另一个字符串类型数组arr2。(1)arr2中有哪些字符串,是arr1中出现的?请打印。(2)arr2中有哪些字符串,是作为ar

2021-02-06 15:19:53 2579 2

原创 自然排序Comparable与比较器排序Comparator

自然排序Comparable要让一个类使用排序服务必须让它实现comparaeTo方法这是因为需要向sort方法提供比较方式任何实现Comparable接口的类都需要包含compareTo方法注意这里的相减技巧不适用于浮点值举例:下面以Student按照id从小到大排序分别用两种方式实现:比较器排序比较器是实现了Comparator接口的类的实例方法1:实现Comparable接口import java.util.*;public class ComparableTest {

2021-02-03 12:04:05 259

原创 二分查找

二分查找的代码(非递归的方式实现)public class Demo1 { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6}; int index = binarySearch(arr, 3); System.out.println(index); } public static int binarySearch(int[] arr, in

2021-02-01 18:40:33 49

原创 【redis】缓存穿透,缓存击穿,缓存雪崩

缓冲击穿,缓冲穿透,缓冲雪崩redis在高并发环境下常遇到的问题1.缓存穿透缓存穿透是利用redis和mysql的机制(Redis缓存一旦不存在就访问mysql),直接绕过缓存访问mysql,而制造的db请求压力,一般在代码中防止这个现象发生利用不存在的key绕过缓存直接访问db2.缓存击穿缓冲由于某种原因失去了拦截高并发的能力某一个热点key在高并发访问的情况下,突然失效,导致大量的并发打进mysql数据库的情况3.缓存雪崩缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,导致的d

2020-12-31 17:36:56 61

空空如也

空空如也

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

TA关注的人

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