自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 剑指Offer第三十四题:第一个只出现一次的字符

剑指Offer第三十四题:第一个只出现一次的字符思路1:如果一个字符在字符串中第一次出现的位置与最后一次出现的位置相同,那么这个字符就只出现一次求String中某个字符第一次出现的位置indexOf(char c)求String中某个字符最后一次出现的位置lastIndexOf(char c)public class Solution { public int FirstNotRepeatingChar(String str) { if(str == null ||

2020-09-03 10:03:52 147

原创 剑指Offer第三十三题:丑数

.剑指Offer第三十三题:丑数此题思路参考:/*说下思路,如果p是丑数,那么p=2^x * 3^y * 5^z那么只要赋予x,y,z不同的值就能得到不同的丑数。如果要顺序找出丑数,要知道下面几个特(fei)点(hua)。对于任何丑数p:(一)那么2*p,3*p,5*p都是丑数,并且2*p<3*p<5*p(二)如果p<q, 那么2*p<2*q,3*p<3*q,5*p<5*q现在说说算法思想: 由于1是最小的丑数,那么从1开始,把2*1,3*1,

2020-09-03 09:38:01 186

原创 剑指Offer第三十二题:把数组排成最小的数

剑指Offer第三十二题:把数组排成最小的数暴力思路:递归回溯得到所有的排列组合,取出值最小的排列结题思路:对数组进行排序,排序结果能够按照组合数最小的顺序排列关键怎么排序,这里使用局部比较的方式,当两个字符串s1和s2,组成的字符串s1+s2字典序小于s2+s1时,将s1放在s2的前边。这样得到的数组就是想要的结果了,只需要将其串联为一个字符串就可以了import java.util.*;public class Solution { public String PrintMinN

2020-09-03 09:08:05 117

原创 剑指Offer第三十一题:十进制整数1到n中1出现的总次数

剑指Offer第三十一题:十进制整数1到n中1出现的总次数参考思路:牛客网网友:https://www.nowcoder.com/profile/7046624public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int count = 0; int i = 1; int high = 0,low = 0, curr = 0; whi

2020-09-02 23:38:44 108

原创 剑指Offer第三十题:连续子数组的最大和

剑指Offer第三十题:连续子数组的最大和使用动态规划来求解使用一个临时变量tempsum,返回值是sum遍历整个数组,当tempsum>0时,tempsum加上下一个数组元素,当tempsum小于等于0时,tempsum = 下一个数组元素的值。每遍历一个结点更新sum的值,取tempsum和sum 的较大值最大值有两种来源,当前值或者前边的字段和加当前值public class Solution { public int FindGreatestSumOfSubArray

2020-09-02 23:06:54 78

原创 剑指Offer第二十九题:最小的k个数

剑指Offer第二十九题:最小的k个数使用一个最大堆:根结点最大最大堆先存储数组中前k个元素,将数组中其余的元素逐一与最大堆顶元素比较,如果小于堆顶元素,就将堆顶元素移除,并添加当前元素。实现:使用PriorityQueue来实现最大堆,内置比较器(Integer o1,Integer o2){当o1<o2时,返回-1,否则返回1,可以实现队头元素大于队尾元素,PriorityQueue的底层是用最大堆或者最小堆实现的}import java.util.*;public

2020-09-02 22:48:48 102

原创 剑指Offer第二十八题:数组中出现次数超过一半的数

剑指Offer第二十八题:数组中出现次数超过一半的数如果这个数存在,那么将数组排序后,中位数必然是这个数所以只需要将数组排序,取中位数,再检查中位数的个数是否超过半数import java.util.*;public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0){ return 0;

2020-09-02 18:47:08 53

原创 剑指Offer第二十七题:字符串的排列

剑指Offer第二十七题:字符串的排列典型的递归回溯: 当前排列 标志列表(已选为true,未选为false) 临时字符,避免重复递归终止条件:当前排列长度等于总长度curr.length() == strchar.length递归回溯:将下一个一个false并且与前一次字符不相同的字符加入当前排列,递归,结束后回溯为了避免重复,要求在一开始对字符进行排序,这样重复的字符在连续位置,只需要比较前后元素就可以避免掉重复元素。import java.util.*;public class

2020-09-02 18:35:17 88

原创 剑指Offer第二十五题:深拷贝复杂链表

剑指Offer第二十五题:深拷贝复杂链表输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)这个题的难点在于每一个新链表结点要连接到对应的新链表中的两个指针指向的结点很难在建表过程中也把连接关系建立起来可以使用hashmap,键指向原结点,值指向新结点再把链表遍历一遍,利用hashmap的对应关系,建立连接关系/*

2020-09-02 11:57:23 136

原创 剑指Offer第二十四题:二叉树中和为某一给定值的路径

剑指Offer第二十四题:二叉树中和为某一给定值的路径典型的递归回溯当当前结点是叶子结点并且路径和为target时,找到一条路径当当前和currSum大于target时,这个结点往下不需要再找了当当前结点不是叶子结点并且currSum小于target时,查找该结点的左右子节点import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNod

2020-09-02 11:32:11 74

原创 剑指Offer第二十三题:由一个后序遍历判断是否是二叉搜索树

剑指Offer第二十三题:由一个后序遍历判断是否是二叉搜索树输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。这个题要从二叉搜索树的定义来做,左子树全部小于根节点,右子树全部大于根节点,方案就是检查每一层的左子树和右子树是否都能满足大小关系现在问题就是怎么找出左子树和右子树,这个根据后序遍历的特点,左子树在前,右子树在中间、根结点在最后边从左往右找,如果发现一个结点的值大于根节点的值,说明到

2020-09-02 11:01:00 238

原创 剑指Offer第二十二题:层序遍历二叉树

剑指Offer第二十二题:层序遍历二叉树层序遍历需要使用一个队列来保存每一层每一个结点,当队列中一个结点出队时,将其左右子结点入队。import java.util.*;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/

2020-09-02 10:38:58 106

原创 剑指Offer第二十一题:栈的压入、弹出序列

剑指Offer第二十一题:栈的压入、弹出序列这个题思路就是创建一个栈来模拟压栈和出栈的操作将压栈数组逐个压栈,使用一个索引来记录当前出栈序列的位置,当出现栈顶元素和出栈数组当前数相等时,说明需要出栈操作,进行出栈,因为可能在一次压栈之后会有多个出栈,因为要用while循环来出栈import java.util.*;public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) {

2020-09-02 09:50:40 86

原创 面试回答草稿:操作系统篇:2、虚拟内存

面试回答草稿:操作系统篇:2、虚拟内存Q:请你讲一讲虚拟内存虚拟内存主要是解决内存空间不足的问题,但其实它面对的问题又是内存空间利用率低的问题。产生这个矛盾的原因在于,进程的创建的时候操作系统会给进程分配内存空间,但是进程在程序运行过程中,在每一个时间段内,只会用到程序中的一部分数据,而存储的其他数据实际上被没有被用到。但是还是要给每个进程划分一块内存,并且确保这一块内存能把进程在执行过程中的所有数据都存储起来,所有内存又显得很不足。这种内存分配的方式是一种对外抠门,对内大方的方式,在分配时,尽量

2020-08-27 10:27:56 199

原创 面试回答草稿:操作系统篇:1、线程与进程

面试回答草稿:操作系统篇:1、线程与进程:Q:讲一讲线程与进程吧?在单道批处理系统中,多个任务被提前存储到磁盘里边,然后由计算机依此来读取执行,单道批处理系统中多个任务是串行执行的,每一时刻只有一个设备在运转,可能是cpu在计算,IO设备空闲等待,或者正在IO,cpu在空闲等待,设备使用率比较低。多道批处理系统为了提高单道批处理的设备使用率,降低任务处理时延提出,它的实现基础就是进程,一个处于运行状态的程序就是一个进程,进程在运行时,操作系统会为这个系统分配独立的内存空间,进程信息,进程在运行过程中

2020-08-27 09:52:05 110

原创 了解Java容器吗?讲一讲!

Java面试发言稿:容器篇(一)概述:常用的java容器有三大类:顺序存储的list,去重的set,存储键值对的maplist主要实现有基于数组实现连续存储的ArrayList,基于链表实现的LinkedListArrayList与LinkedList的区别 数据结构 线程安全 插入和删除复杂度 继承树数据结构在数据结构上ArrayList是一个Object数组,一开始是一个空数组,第一次插入元素时,会将数组初始化为长度为10的数组,之后每一次空间不足时,扩容为原来的1.5倍。

2020-08-26 22:22:31 144

原创 JavaAQS框架个人学习笔记整理

1、背景:在1.5之前,加锁只能使用synchronized关键字,而synchronized在实现时,调用了native方法start0,借助操作系统来实现线程同步的控制,需要实现从用户态到内核态的切换,是一把重量锁,加锁的性能比较差。1.1、交替执行和竞争执行在并发同步中有两种情况,一种是多线程交替执行,一种是多线程竞争执行,在很多情况下,都是交替执行的,在交替执行时,在一个时刻只有一个线程想去访问共享资源,因此不会有线程需要等待;而在竞争执行时,在一个时刻会有多个线程想去访问同一共享资源syn

2020-08-19 14:26:39 209

原创 剑指offer第二十题:包含min函数的栈

剑指offer第二十题:包含min函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。import java.util.Stack;public class Solution { Stack<Integer> stack = new Stack<>(); Stack<Integer> minStack = new Stack<>(); public void push(

2020-08-18 09:27:54 56

原创 剑指Offer第十九题:顺时针打印矩阵

剑指Offer第十九题:顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.用这个边界top、left、right、bottom来限制循环的范围,每遍历一圈,更新四个边界值import java.util.ArrayList;public class Solution

2020-08-18 09:27:38 83

原创 剑指Offer第十八题:二叉树的镜像

剑指Offer第十八题:二叉树的镜像递归,当前结点不是叶子结点也不是null时,直接交换该结点的左右子树,然后递归/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { p

2020-08-18 09:27:06 75

原创 剑指Offer第十七题;树的子结构,检查一个树是否为另一个树的子树

剑指Offer第十七题;树的子结构,检查一个树是否为另一个树的子树输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)外递归函数:进行条件判断,当两个树都不为空时,才有可能是子结构当找到一个结点和子结构的根结点相同时,进入内递归函数检查其结点是否相同 内递归函数:当子树为空时,说明已经遍历了子树的所有结点,并且全部相同,返回true当父树为空时,能进入这个if说明子树还不是null,因此不是子结构,返回false当子树结点和父树结点相等时,正常递归检查

2020-08-17 21:35:30 66

原创 剑指Offer第十六题:合并两个排序的链表

剑指Offer第十六题:合并两个排序的链表题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:使用归并排序初始化:创建一个dummyNode,来作为头结点的前一个结点创建一个currNode = dummyNode,来遍历链表为了防止破坏原链表,用两个临时指针p1和p2指向list1和list2遍历链表,将两个链表中当前头结点较小的结点归并到链表中/*public class ListNode { int val;

2020-08-17 20:57:21 84

原创 剑指Offer第十五题:反转链表

剑指Offer第十五题:反转链表输入一个链表,反转链表后,输出新链表的表头。头插法初始化:头结点pre = new ListNode(head);临时结点next,指向head的下一个结点遍历链表,循环停止条件next == null2.1 先让head指向next结点 head = next2.2 先用临时结点存储下一个结点next = next.next2.3 进行反转,修改head.next,让head指向pre: head.next = pre;2.4 更新pr

2020-08-17 20:41:22 78

原创 剑指Offer第十四题:打印链表中倒数第k个结点

剑指Offer第十四题:打印链表中倒数第k个结点输入一个链表,输出该链表中倒数第k个结点。使用快慢指针法快指针先走k步,然后快慢指针同时走,当快指针到尾巴时,慢指针指向倒数第k个元素/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public

2020-08-17 18:39:16 161

原创 剑指Offer第十三题:调制数组顺序使奇数位于偶数的前边,并且奇数相对顺序不变,偶数相对顺序不变

剑指Offer第十三题:调制数组顺序使奇数位于偶数的前边并且奇数相对顺序不变,偶数相对顺序不变输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。要保持相对顺序,就需要采用一种稳定的排序算法,如冒泡排序算法冒泡排序法:1.确定排序遍历的轮数:array.length次,i 从0到length-12.每一轮的逻辑:当相邻元素前偶后奇时,交换;在每一轮开始前,后i个元素已经排好了顺

2020-08-17 18:20:11 211

原创 剑指Offer第十二题:数值的整数次方

剑指Offer第十二题:数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0这道题没什么算法需要考虑,只需要考虑几种情况就好1、底数或者指数为0时2、指数是正数数时3、指数是负数时public class Solution { public double Power(double base, int exponent) { if(base == 0.0){

2020-08-17 17:05:28 59

原创 剑指Offer第十一题:二进制中1的个数

剑指Offer第十一题:二进制中1的个数输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。常规算法:获得这个数的二进制字符串,对字符串诸位计数public int NumberOf1(int n) { String s = Integer.toBinaryString(n); int count = 0; for(int i = 0; i<s.length(); i++){ if(s.charAt(i)

2020-08-17 16:53:37 96

原创 剑指Offer第十题:矩形覆盖

剑指Offer第十题:矩形覆盖我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?根据第一个矩形是横着还是竖着分为两种递归public class Solution { public int RectCover(int target) { if(target <= 0){ return 0; } if(target == 1){

2020-08-17 16:24:12 73

原创 剑指Offer第九题:变态跳台阶

剑指Offer第九题:变态跳台阶一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。第一步可以跳1,2,3,4,。。。,n步//f(n) = f(n-1) + f(n-2) + f(n-3)+f(n-4)+。。。+f(0)//f(n-1) = f(n-2) + f(n-3)+f(n-4)+。。。+f(0)//f(n) = 2*f(n-1);//递归递归public class Solution { public int Ju

2020-08-17 16:05:59 77

原创 剑指Offer第八题:跳台阶

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。斐波那契数列同样可以使用两种做法递归public class Solution { public int JumpFloor(int target) { if(target == 1){ return 1; } if(target == 2){ return 2; .

2020-08-17 14:25:19 62

原创 剑指Offer第七题:斐波那契数列

剑指Offer第七题:斐波那契数列递归,性能较差public class Solution { public int Fibonacci(int n) { if( n == 0) return 0; if( n == 1){ return 1; } else{ return Fibonacci( n-1 )+ Fibonacci( n-2 );

2020-08-16 22:16:31 65

原创 剑指Offer第六题:旋转数组的最小数字

剑指Offer第六题:旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。采用二分法,比较的基准是索引为0的元素,第一步:将尾部可能存在与array[0]相同的元素剔除第二步:检查数组是否发生了旋转,若无,直接返回array[0]第三步:二分搜索,当mid

2020-08-16 18:00:48 75

原创 剑指Offer第五题:用两个栈实现队列

剑指Offer第五题:用两个栈实现队列用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。栈1主要用来入队,直接入栈即可栈2主要用来出队,出队时,如果栈2不为空,就将栈1元素全部压入栈2,再将栈2栈顶元素弹栈,这样可以确保弹栈元素是最早入队的import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>();

2020-08-16 17:29:32 94

原创 剑指Offer第四题:重建二叉树

剑指Offer第四题:重建二叉树== 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。==** 重建二叉树,需要使用递归,起始找到根节点,创建根节点,再递归查找根节点的左右子树 **/** * Definition for binary tree * public class TreeNode { *

2020-08-16 17:18:29 98

原创 剑指Offer第三题:从尾到头打印链表

剑指Offer第三题:从尾到头打印链表== 输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 ==/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayList;impo

2020-08-16 16:45:18 60

原创 剑指Offer第二题:替换空格

剑指Offer第二题:替换空格请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。public class Solution { public String replaceSpace(StringBuffer str) { //将字符串变成StringBuffer, //创建一个StringBuffer,从头到位逐个检查str,遇见一个空格就append("

2020-08-16 16:37:09 62

原创 剑指Offer第一题:二叉数组中的查找

二叉数组的查找public class Solution { public boolean Find(int target, int [][] array) { //数组是右下最大,左上最小 //查找时应该从右上查找,如果有target大于当前数,则说明当前行已经失效,应将行号加1 //如果小于当前数,则应加列号减1 if(array == null || array.length == 0 || array[0]

2020-08-16 16:28:54 54

原创 Java反射学习笔记

本篇基于黑马程序员-Java语言高级部分反射部分教程:https://www.bilibili.com/video/BV1C4411373T?p=71、反射概念:将类的各个组成部分封装为其他对象(Class对象),这就是反射机制要先看懂概念,先搞懂Java代码的加载过程:2、Java代码在计算机中经历的三个阶段:Source源代码阶段: 编译过程:java代码编译为class文件,还没有进入内存,而是存储在硬盘上 Class类对象阶段: 类加载过程...

2020-07-30 15:13:35 222

原创 四种创建Java线程的方式

目录1、继承Thread类,重写run方法2、实现Runnable接口,将实现对象传入到Thread()构造器中3、实现Callable接口,注意Callable接口可以指定泛型,因此这种线程可以有返回值4、利用线程池创建线程,会直接将线程池中的一个空闲线程调来使用1、继承Thread类,重写run方法public class MyThread extends Thread { public void run() { for(int i = 0;i<10;i++) {

2020-07-29 14:42:37 101

原创 比较 synchronized和Reentrantlock

1、级别不同:Synchronized是java的一个关键字,用于对所修饰的区域加锁,实现线程同步;ReenTrantLock是java提供的一个实现加锁的类,也可以实现线程同步。2、重入锁:Synchronized和ReentrantLock都是重入锁3、锁对象:(1)synchronized:Synchronized可以修饰方法、代码块等,可以指定锁对象,在修饰方法时,也可以不指定锁对象,当不指定锁对象时,但在修饰代码块时要求指定锁对象;当修饰静态方法时,如果不指定锁对象

2020-07-29 11:37:36 108

空空如也

空空如也

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

TA关注的人

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