自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 跳房子——动态规划

存在n+1个房间,每个房间依次为房间1 2 3…i,每个房间都存在一个传送门,i房间的传送门可以把人传送到房间pi(1<=pi<=i),现在路人甲从房间1开始出发(当前房间1即第一次访问),每次移动他有两种移动策略:A. 如果访问过当前房间 i 偶数次,那么下一次移动到房间i+1;B. 如果访问过当前房间 i 奇数次,那么移动到房间pi;现在路人甲想知道移动到房间n+1一共需要多少次移动;输入描述:第一行包括一个数字n(30%数据1<=n<=100,100%数据 1&lt

2021-06-04 18:27:36 1227

原创 错排问题(装错信封)

NowCoder每天要给很多人发邮件。有一天他发现发错了邮件,把发给A的邮件发给了B,把发给B的邮件发给了A。于是他就思考,要给n个人发邮件,在每个人仅收到1封邮件的情况下,有多少种情况是所有人都收到了错误的邮件?即没有人收到属于自己的邮件。输入描述:输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。输出描述:对应每一组数据,输出一个正整数,表示无人收到自己邮件的种数。思路: 用A、B、C……表示写着n位友人名字的信封,a、b、c……表示n份相应的写好的信纸。把错装的总数为记作D(n)。

2021-06-02 20:52:37 790

原创 最长上升子串——动态规划

广场上站着一支队伍,她们是来自全国各地的扭秧歌代表队,现在有她们的身高数据,请你帮忙找出身高依次递增的子序列。 例如队伍的身高数据是(1、7、3、5、9、4、8),其中依次递增的子序列有(1、7),(1、3、5、9),(1、3、4、8)等,其中最长的长度为4。思路:定义一个dp[n]数组,dp[i]表示以0-i为下标字符串中的最长子序列长度。定义j的范围为0到i-1,如果原数组的arr[j]的值小于arr[i];则比较dp[i]和dp[j]+1值得大小替代dp[i].代码如下:import java.

2021-06-02 20:47:23 348

原创 最长公共子序列——动态规划

我们有两个字符串m和n,如果它们的子串a和b内容相同,则称a和b是m和n的公共子序列。子串中的字符不一定在原字符串中连续。例如字符串“abcfbc”和“abfcab”,其中“abc”同时出现在两个字符串中,因此“abc”是它们的公共子序列。此外,“ab”、“af”等都是它们的字串。现在给你两个任意字符串(不包含空格),请帮忙计算它们的最长公共子序列的长度。输入包含多组数据。每组数据包含两个字符串m和n,它们仅包含字母,并且长度不超过1024。对应每组输入,输出最长公共子序列的长度。思路:建立一个dp

2021-06-02 18:35:53 192

原创 自定义实现优先级队列(堆)

基于数组自定义实现一个最大堆,包括入堆,出堆,弹出堆顶元素,打印整个堆功能。public class MyHeap { private int[] elem; private int usedSize=0; // 初始化一个k大小的数组 public MyHeap(int k){ this.elem = new int[k]; } //入堆 public boolean offer(int val){ if(isF

2021-06-01 22:21:39 92

原创 红与黑——BFS

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的(上下左右四个方向)黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。输入描述:输入包含多组数据。每组数据第一行是两个整数 m 和 n(1≤m, n≤20)。紧接着 m 行,每行包括 n 个字符。每个字符表示一块瓷砖的颜色,规则如下:“.”:黑色的瓷砖;“#”:白色的瓷砖;“@”:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。输出描述:对应每组数据,输

2021-06-01 19:04:02 189

原创 蘑菇阵——动态规划

现在有两个好友A和B,住在一片长有蘑菇的由n*m个方格组成的草地,A在(1,1),B在(n,m)。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?输入描述:第一行N,M,K(1 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。输

2021-06-01 18:57:10 217

原创 JVM(Java虚拟机)

JVM内存布局(HotSpot)JDK1.81、堆:(线程共享)所以的对象都是存在此区域的,此区域也是JVM最大的一块区域。JVM的垃圾回收就是针对此区域的。2、JVM 栈(Java虚拟机栈):(线程私有的)a) 局部变量表:八大基本数据类型,对象的引用。b) 操作栈:每个方法都会对应一个操作栈。c) 动态连接:指向常量池的方法引用。d) 方法返回地址:PC 寄存器的地址。3、本地方法栈:(线程私有的)它与JVM栈比较类似,只不过JVM栈是给Java和JVM使用,而本地方法栈他是为

2021-05-31 22:33:42 187 2

原创 java.util.concurrent 包下的常见类(JUC)

1、ReentrantLock可重入互斥锁注意事项:a) lock() 写在try之前。防止没有枷锁成功,影响正常逻辑调试。b)一定要记得在finally里面进行unLock()。2、信号量一个计数信号量,主要用于控制多线程对共同资源库访问的限制。着重说两个方法:acquire()void:尝试获取锁,如果可以正常获取到,则执行后面的业务逻辑,如果获取失败,则阻塞等待。release() void:释放锁这里用停车场的思想来演示一下:import java.util.Random;i

2021-05-31 20:27:20 324 2

原创 栈和队列的互相转换

用两个栈实现一个队列,包括入队,出队,弹出队首元素,判断队列是否为空功能。import java.util.Stack;public class StackToQueue<T> { private Stack<T> s1 = new Stack<>(); private Stack<T> s2 = new Stack<>(); //入队 public void offer(T val){ thi

2021-05-30 22:48:47 165

原创 自定义队列和自定义循环队列

用链表自定义实现一个队列,包括入队,出队,弹出队首元素,队列是否为空功能class Node<T>{ public T val; public Node<T> next; public Node(T val){ this.val = val; }}public class MyQueue<T>{ public Node<T> first;//队头 public Node<T> l

2021-05-30 21:09:26 117

原创 自定义一个栈

基于数组创建一个栈,有入栈,出栈,弹出栈顶元素,判断栈是否为空,是否为满功能。public class MyStack<T> { private T[] elem; private int top=0; //top表示当前可以存放元素的下标 //构造方法,初始化一个长度为5的数组 public MyStack(){ this.elem = (T[])new Object[5]; } //入栈 public T push(T

2021-05-29 23:05:15 879

原创 锁策略总结

乐观锁乐观锁:它认为一般情况下不会发生并发冲突,所以只有在进行数据更新的时候,才会检测并发冲突,如果没有冲突,则直接修改,如果有冲突,则返回失败。CAS(Compare And Swap 比较并且交换):V(内存值)A(旧值)B(新值)具体流程:V==A?true(没有并发冲突)->V=B; : false(并发冲突)线程的解决方案:加锁、ThreadLocal、Atomic*乐观锁 Atomic*我们先来看一个示例:public class ThreadDemoGJ1 {

2021-05-28 19:43:29 145 1

原创 单例模式与自定义阻塞队列

提升程序性能的方法1、多线程2、单例模式:整个程序的运行中,只存在一个对象。饿汉方式:上来不管啥先创建一个对象再说。(不用加锁也是线程安全的)懒汉方式:当程序启动之后并不会初始化,而是在什么时候调用,什么时候再初始化。设计模式:1、单例模式(手写)2、工厂模式(简单工厂、抽象工厂)3、模板模式…饿汉方式public class ThreadDemoEH1 { static class Singleton{ //1、创建私有的构造函数(为了防止其他类直接创建)

2021-05-28 17:58:43 192

原创 ThreadLocal

线程解决方案1、 加锁加锁⽅案虽然可以正确的解决线程不安全的问题,但同时也引⼊了新的问题,加锁会让程序进⼊排 队执⾏的流程,从⽽⼀定程度的降低了程序的执⾏效率,那有没有⼀种⽅案既能解决线程不安全的 问题,同时还可以避免排队执⾏呢?2、ThreadLocal(ThreadLocal 线程本地变量 :线程级别的私有变量,与任务级别的私有变量完全不同)ThreadLocal经典实用场景:1、解决线程安全问题2、实现线程级别的数据传递ThreadLocal使用1、set(T):将私有变量存放到线程

2021-05-28 17:19:39 107

原创 二叉树四种遍历方式总结——非递归

实现二叉树先序,中序,后序以及层序遍历1、先序遍历具体步骤:1、创建一个栈和一个ArrayList。2、先让根节点入栈。3、当栈不为空时,栈顶出栈,并将出栈节点值保存到ArrayList中,然后再依次将出栈节点的右子节点,左子节点入栈。ps:因为前序遍历要左子节点在右子节点前面,所以先入栈右子节点,后入栈左子节点(栈是先进后出)代码展示:public void preorder(TreeNode root,ArrayList<Integer> list){ if(

2021-05-26 14:51:39 212 4

原创 线程池的创建

线程的缺点1.线程的创建需要开辟内存资源:本地方法栈、虚拟机栈、程序计数器等线程私有变量的内存。频繁的创建和销毁,会带来一定的性能的开销。2、使用线程不能很好的管理任务和友好的拒绝任务。所有就引入了线程池这一技术。线程池线程池定义:使用池化技术来管理和使用线程的技术。这种技术就叫线程池。线程池里面的重要内容:1、线程2、任务队列线程池的执行流程:当拿到一个任务之后,会判断当前线程池里面的数量是否达到了最大值,如果没有达到创建新的线程执行任务;当任务来了之后,线程池的线程数量已经是最大值,并

2021-05-24 11:35:37 245 1

原创 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

题目对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。在这里,我自己用了两个方法去完成这个题。分享给大家。1、中心扩散法中心扩散法很好理解,就是遍历字符串中的每一个字符,以这个字符为中心去向两边扩散,然后依次更替最长的回文字符子串的长度。举个列子:但是现在有一个问题,就是如果下一个字符跟现在的字符相同,我们就得向右移动右边的指针,因为不管是奇数还是偶数,相同字符组成的字符串它总是回文的。代码展示:public clas

2021-05-22 16:14:02 953 1

原创 排序算法总结

为了统一起见,我先给出一个主函数,条例比较清晰public static void main(String[] args) { int[] array = {34,2,67,88,54,33,78,22,4,90,86,45,6,12,99}; System.out.println(Arrays.toString(array)); insertSort(array); System.out.println("直接插入排序:"+Arrays.t

2021-05-20 21:18:40 149 3

原创 多线程之死锁、休眠

死锁问题定义:在多线程编程中(两个或两个以上的线程),因为资源抢占而造成线程无限等待的问题。线程和锁的关系:一对多 一个线程可以拥有多把锁,而一把锁只能被一个线程所拥有。检测死锁工具 jconsole jmc jvisualvm排查死锁死锁的关键代码synchronized (lockA){ System.out.println("线程1得到了锁A"); try { //休眠1秒 让线程2先得到锁B Thread.sleep(1000);

2021-05-11 19:41:18 240 1

原创 多线程之属性、中断、状态、安全

查看线程的一些属性public class ThreadDemo12 { public static void main(String[] args) { Thread t1 = new Thread(()->{ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrac

2021-05-11 19:19:53 420 4

原创 多线程之创建、休眠、分组、优先级、分类

线程的创建方式1、继承Thread类实现线程的创建方式(两种写法)缺点:Java语言的设计当中只能实现单继承,如果继承了Thread类,就不能继承其他类了。public class ThreadDemo4 { static class MyThread extends Thread{ @Override public void run() { //线程执行任务 System.out.println("线程名称:"

2021-05-10 22:09:26 186 1

原创 操作系统、进程、线程

操作系统硬件:冯诺依曼体系结构/普林斯顿体系结构具体的结构布置:注意:CPU和输入设备或者输出设备不能直接进行交互,必须依靠存储。内存VS硬盘:1、内存的读写速度远远大于磁盘,内存读写速度:纳秒(10^-9);硬盘读写速度:微秒(10^-3);2、内存价格远大于磁盘;3、内存中的数据不能持久化,当电脑重启数据就没了,磁盘的数据可以持久化。操作系统的概念:任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。分为:内核(进程管理,内存管理,文件管理,驱动管理)、其他程序(例如函数

2021-05-10 19:47:33 134 2

原创 网络原理之IP

IP协议(IP协议在网络层)网络层在复杂的网络环境中确定一个合适的路径。1 IP协议概念:主机: 配有IP地址, 但是不进行路由控制的设备;路由器: 即配有IP地址, 又能进行路由控制;节点: 主机和路由器的统称;IP协议头格式4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是

2021-05-09 17:13:05 222 1

原创 网络原理之TCP

TCP协议(TCP协议在传输层)本文也会讲一些有关UDP协议的一些知识。1 端口号端口号(Port)标识了一个主机上进行通信的不同的应用程序在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看)知名端口号(1-1023):FTP(21)/SSH(22)/HTTP(80)/HTTPS(443)/DNS(53)操作系统动态分配的端口号(1024-65535):MySQL(3306)/To

2021-05-09 15:53:21 122

原创 总结篇——插入排序

插入排序1、直接插入排序1.1 直接插入排序-原理整个区间被划分为有序区间和无序区间。每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。1.2 实现 public static void main(String[] args) { int[] array = {34,2,67,88,54,33,78,22,4,90,86,45,6,12,99}; System.out.println(Arrays.toString(array)); i

2021-05-08 14:09:27 157 1

原创 当在浏览器中输入URL地址之后会发生什么?

当我们在浏览器上输入一个URL地址时,浏览器是怎么一步一步实现的,我来给大家说说。1、浏览器会先检查你的URL地址的正确性。2、浏览器会检查这个URL有没有缓存,如果有缓存就取缓存。3、DNS域名解析,拿到IP进行访问。4、TCP3次握手。5、HTTP协议request内容发送(首行、head、空行、body)。6、服务器接收到请求,并且进行相应的业务处理。7、服务器将结果返回到客户端。8、浏览器拿到返回结果,并调用浏览器的内核实现前端页面的渲染。9、TCP4次挥手。...

2021-05-07 18:23:23 1578

原创 初识网络原理

网络发展1、独立模式:计算机之间相互独立。2、网络互联: 多台计算机连接在一起, 完成数据共享。3、局域网LAN: 计算机数量更多了, 通过交换机和路由器连接在一起。4、广域网WAN: 将远隔千里的计算机都连在一起。所谓 “局域网” 和 “广域网” 只是一个相对的概念。广域网也可以看做为一个大的局域网。网络协议分层OSI七层模型应用层:通俗的讲就是我们的代码层,针对特定应用的协议。常见的应用层协议有:XSELL、SSH、SFTP、HTTP等。表示层:设备固有数据格式和网络标准数据格式

2021-05-07 18:15:31 78

原创 总结篇——数组的定义与使用

1、数组基本用法1.1什么是数组数组本质上就是让我们能“批量”创建相同类型的变量。注意事项:在java中,数组中包含的变量必须是相同类型。1.2创建数组动态初始化数据类型[] 数组名称 = new 数据类型[]{初始化数据};int[] arr = new int[]{1,2,3};静态初始化数据类型[] 数组名称 = {初始化数据};int[] arr = {1,2,3};注意事项:静态初始化的时候,数组元素个数和初始化数据的格式是一致的。1.3数组的使用代码示例:获取长度&

2021-04-28 20:44:05 443

原创 如何定位url路径资源

URL是统一资源定位符,是互联网上标准资源的地址。URL由以下几部分组成:1、协议类型:http、https(加密SSL)2、服务器:(域名/IP)3、端口号:http(80)、https(443)4、目录5、页面地址 (参数以?开始,多个参数使用&分割,键值对用=分割)6、片段标识符基本格式协议://域名(IP):端口号/资源路径。...

2021-03-28 18:08:01 244

原创 用HTML,CSS,JS制作一个网页计算器

今天分享一个自己做的网页计算器,我个人感觉,虽然不精简,但是应该涉及到的东西都有了,所以分享出来,那我直接上代码了。<html><head> <meta charset="utf-8"> <title>我的计算器</title> <script src="jquery-1.9.1.min.js"></script> <script> function myck(

2021-03-27 11:46:56 3278 2

原创 javaweb之前端三剑客

前端三剑客:HTML,CSS,JavaScriptHTML:构建一个pc和移动端展示的页面(搭骨架/骨)。CSS:使样式,显示更加丰富(装修/皮)。JavaScript:调用后端窗口(API)(魂)。HTML:运行需要浏览器HTML的一些元素类型:块级元素:<p>我是内容</p> //用于分割下一块的内容,间隙较大。行级元素:<span>我是内容</span> //没有具体的意义,为css修饰做准备空元素:<img src="图片

2021-03-26 21:15:12 282 6

原创 java——顺序表一些功能实现

顺序表的一些功能实现分享一下我花了将近两小时的写的一个顺序表功能实现的函数,虽然很简单,但是我感觉自己写一遍还是收货满满,让我更加清楚地认识了类和对象的关系,在一个类里面的方法,构造方法,静态变量,实例变量以及封装的概念。import java.util.Arrays;public class MyArrayList { private int[] elem; // 封装 private int usedSize; // 封装 public MyArrayList()

2020-12-30 16:34:34 107

原创 java——数组相关练习题5道

实现一个方法 avg, 以数组为参数, 求数组中所有元素的平均值(注意方法的返回值类型).import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int[] array = new int[6]; for (int i = 0; i < 6; i++)

2020-12-10 17:01:51 609

原创 java——运算符

1、算术运算符基本四则运算符 + - * / %这些运算符都比较简单,需要注意的是除法 /。a) int/int结果还是int,当计算结果不为整数时,需要使用double来计算。比如:int a = 1;int b = 2;System.out.println(a/b);//结果为0b) 0不能作为除数c) %表示取余,不仅仅对int求模,也能对double求模比如:System.out.println(11.5%2.0);// 运行结果1.5增量赋值运算符 += -=

2020-12-09 13:37:07 297 2

原创 java——一些简单的习题2

import javax.naming.directory.SearchControls;import java.util.Scanner;public class DemoA { public static int Fib3(int n){ int mul = 1; for (int i = 1; i <=n ; i++) { mul *= i; } return mul; } p

2020-12-09 12:11:04 96

原创 java——一些简单的习题

import java.sql.SQLOutput;import java.util.Scanner;public class DemoB { public static void main10(String[] args) { // 汉诺塔问题 hanota(3,'a','b','c'); } public static void hanota(int n,char pos1,char pos2,char pos3){ if(n==1)

2020-12-09 12:08:46 86

原创 青蛙跳台阶三种方式(java)

我具体写了青蛙跳台阶的非递归方式,递归方式以及变态跳import java.util.Scanner;public class DemoB { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); System.out.println(jump1(n)); System.out.prin

2020-12-07 19:42:05 164

原创 初学java

关于我对java的第一印象今天我正式开始了学习java语言,在之前,我一直都是学的c语言,也对编程有了很大的兴趣。所以我现在要认真学好这第二门语言。在我学习第一节java课之后,我感觉有一定的c语言知识对学习java有一定的帮助,因为有许多东西跟c语言很类似,比如数据类型,变量等等,但也只是相似,它们之间还是有一定的差别。所以我在今后的java学习道路上不能大意,从基础出发,我也相信我一定可以学好java这门编程语言。再说一些我额外学到的东西1、前端三剑客:HTML+CSS+JS2、java的运行环

2020-12-04 14:17:05 121 2

原创 C语言——指针的进阶

指针数组int* arr[10] // 定义一个数组,里面存放的是(int*)类型的元素 char* arr[5] //定义一个数组,里面存放的是(char*)类型的元素数组指针int(*p)[5]=&arr //定义一个指针(*p)指向一个整型数组int [5]如何通过p访问数组中的元素:*(*p+1)二位数组二维数组名 /二维数组的首元素 : 代表一维数组的地址p[i][j]=*(*(p+i)+j) // 如何拿到数组中的元素 []自带解引用存放数组指针的数组

2020-11-24 11:49:31 113

空空如也

空空如也

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

TA关注的人

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