- 博客(41)
- 收藏
- 关注
原创 【剑指offer-ACM】JZ24-合并两个有序链表
思路:同时遍历两个链表,比较两个链表当前节点的大小,选出较小的节点。当一个链表遍历完后跳出循环,此时要判断是否还有一个链表没遍历完,没遍历完的链表所有值肯定比已经形成的新链表的每个值都大,所以直接连在后面就可以。package com.zf;import java.util.List;import java.util.Scanner;//合并两个有序链表public class JZ25 { static class ListNode{ int val;
2021-12-01 23:12:44
538
原创 【剑指offer-ACM】JZ24-反转链表
思路:遍历链表的同时对链表进行反转,时间复杂度为O(1)。首先定义一个前驱节点指向当前节点的前驱,当前节点指向当前节点,利用当前节点对链表进行遍历,当当前节点的next为空时说明到达最后一个节点,就让头结点等于最后一个节点,同时在循环中先记录当前节点的下一个节点。因为改变当前节点的指针,后继节点就丢失了。package com.zf;import java.util.Scanner;//返转链表public class JZ24 { static class ListNode{
2021-12-01 22:22:10
596
原创 【剑指offer-ACM】JZ6-倒序输出链表
思路:使用一个栈来保存元素,利用栈的先进后出的特性,逐个弹出栈中元素加入list集合,即可实现倒序输出。package com.zf;//倒序输出链表import java.util.*;//构造链表节点public class JZ6 { static class ListNode{ int val; ListNode next=null; public ListNode(int val) { this.val =
2021-12-01 22:09:26
531
原创 多级反馈队列调度算法
如果有很多任务排队等着被处理,哪个任务先被处理,哪个任务后处理,这个需要由操作系统决定,这就是调度。多级反馈队列调度算法是目前操作系统调度算法中被公认的一种较好的调度算法。它可以满足各种类型进程的需要,既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。基本概念多级反馈队列调度算法是一种根据先来先服务原则给就绪队列排序,为就绪队列赋予不同的优先级数,不同的时间片,按照优先级抢占CPU的调度算法。算法的实施过程如下:按照先来先服务原则排序,设置N个就绪队列为Q1,Q2…QN,每个队列中都可以放很
2021-11-28 22:17:20
3374
原创 Java中类加载过程
Java中类加载过程类的生命周期类加载过程类加载过程主要分为以下三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。加载加载过程中,主要完成三个工作:通过类的全类名找到该类的二进制字节流。将字节流所代表的静态存储结构转化为方法区中运行时数据结构。在内存中生成一个该类的class对象,作为方法区中数据的访问入口。注:加载阶段和连接阶段的部分工作是同步进行的,加载阶段未结束,可能连接阶段就已经开始工作了。连接连接主要有以下三个过程验证
2021-11-14 20:14:35
495
1
原创 两款垃圾回收器-CMS&G1
两款垃圾收集器-CMS&G1CMSCMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。CMS是hotspot虚拟机第一款真正意义上的(基本上)实现GC工作线程和用户线程同时工作的垃圾收集器。CMS采用的垃圾收集算法是标记-清除算法。它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:初始标记:暂停其他所有线程,标记一下GCROOTS能够关联到的对象。这个阶段速度很快并发标记:从
2021-11-13 21:09:44
880
原创 Java中一个对象的创建过程
Java中一个对象的创建过程step1:检查该类是否被加载当JVM执行一条new指令时,首先要去常量池中查找该类的符号引用。当在常量池中查找到该类的符号引用,就说明该类已经被类加载(方法区保存了该类的类加载信息),就可以继续执行后续操作。当在常量池中查找不到该类的符号引用,说明该类还没有被类加载,因此就要用类加载器执行该类的类加载过程。类加载完毕后执行后续操作。step2:为对象分配内存类加载之后,就要为新生对象分配内存空间。对象的大小在类加载的过程中就已经确定。分配空间有两种方式:1.指针碰撞
2021-11-11 21:38:36
1487
原创 并发基础(一)
并发基础(一)1.什么是进程,什么是线程?进程是程序的一次执行过程,进程是系统运行程序的最小单位。系统运行一个程序就是一个进程从创建,运行到销毁的过程。线程是比进程更小的执行单位,在一个进程中可以包含一个或者多个线程。同一个类的不同线程共享进程的方法区和堆,并且每个线程都有自己的虚拟机栈,本地方法栈和程序计数器。所以系统在产生一个线程,在不同线程之间进行切换的时候所付出的资源开销远小于进程。因此线程又被称为轻量级进程。2.线程和进程的区别?线程是进程划分出来的更小的执行单位,线程和进程最大的不同是
2021-11-03 17:50:21
163
原创 Java容器重点知识复习(一)
1.ArrayList和LinkedList的区别1.底层数据结构:ArrayList底层使用的是Object数组,LinkedList底层使用的是双向链表。2.是否线程安全:两者都是不同步的,所以都是线程不安全的。3.插入和删除操作受元素位置影响:对于ArrayList来说,插入和删除元素操作受元素位置影响。使用add方法添加元素时,会默认添加到列表末尾,时间复杂度为O(1),若在指定位置i添加或者删除元素,时间复杂度为o(n-i)。因为要将下标i和i后的所有元素前移或后移一位。对于LinkedL.
2021-11-01 23:15:37
136
原创 计算机网络面试常见题.(一)md
计算机网络面试常见题1.五层协议体系结构及各层作用1.应用层应用层的任务是通过应用进程间的交互来完成特定的网络应用。应用层协议定义的是应用进程之间通信和交互的方式,对于不同的应用程序有不同的应用层协议。常见的有域名系统DNS,万维网应用的HTTP协议2.运输层运输层主要负责为两台主机的进程之间的通信提供通用数据传输服务,应用进程利用该服务传递应用层报文。通用的数据传输服务指的是不针对某一特定的网络应用,而是多种网络可以使用同一个运输层服务。运输层协议主要有两种 TCP:提供面向连接的,面向字节流的
2021-10-27 23:28:12
1990
1
原创 【剑指offer】队列+BFS+二叉树三道典型例题
【剑指offer】队列+BFS+二叉树三道典型例题简单介绍一下BFS其过程简单来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。对于上面的例子,BFS的结果就是A,B,C,D,E,F,G,H,I(假设每层节点从左到右访问)。广度优先遍历各个节点,需要使用队列(Queue)这种数据结构,其特点是先进先出。也可以使用双端队列,区别就是双端队列首尾都可以插入和弹出节点。整个遍历过程如下:1)首先将A节点插入队列中,queue(A);2)将A节点弹出,同时将A的子结点B、C插
2021-09-29 08:57:21
141
1
原创 【剑指offer】行星碰撞-利于辅助栈并且判断碰撞条件
解题思路通过题目描述可以了解到,只有当数组中正负数分界线左边为正数,右边为负数时,才会发生碰撞,当数组中全为负数或者全为正数时(即不存在分界线),或者分界线左侧为负数,右侧为正数,例如 [-2,-1,1,2]以上几种情况时,不可能发生碰撞。用一个辅助栈当当前元素与栈顶元素异号,且分界线左侧为正数,右侧为负数(此时当前元素应为负,栈内元素为正),判断栈顶元素和当前元素绝对值大小1:当前元素绝对值<栈顶元素绝对值,栈顶元素不变,即此时当前元素爆炸;2:当前元素绝对值>栈顶元素绝对值,栈顶.
2021-09-28 14:26:31
85
原创 简单图书管理系统练习-Java+Mysql
一、梳理功能1.能够表示书籍信息,针对每本书来说,序号,书名,作者,价格,类型。2.能够表示用户信息,普通用户,管理员。3.支持的操作:对于普通用户:查看书籍列表,查询指定书籍,借书还书。对于 管理员:查看书籍列表,新增删除书籍。二、准备数据库创建用户表和书籍表create database if not exists java100_bookmanager;use java100_bookmanager;drop table if exists book;//设置id为自增主键cr
2021-09-25 15:21:05
8826
20
原创 基于比较的排序算法基本原理及Java实现
基于比较的排序算法基本原理及Java实现1. 七大基于比较的排序-总览1.1常见基于比较的排序分类1.2时间复杂度,空间复杂度以及稳定性。稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eePZLeWQ-1631196489338)(C:\Users\Administrator\AppData\Roaming\Typora\
2021-09-09 22:10:34
520
12
原创 acwing860 染色法判断二分图
给定一个n个点m条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数n和m。接下来m行,每行包含两个整数u和v,表示点u和点v之间存在一条边。输出格式如果给定图是二分图,则输出“Yes”,否则输出“No”。数据范围1≤ n,m≤ 105输入样例:4 41 31 42 32 4输出样例:Yes#define _CRT_SECURE_NO_WARNINGS 1//当无向图图中不含有奇数环时此图一定为二分图//染色法判定二分图://当一
2021-05-27 16:54:55
125
原创 acwing859 kruskal求最小生成树
#define _CRT_SECURE_NO_WARNINGS 1//不需要用邻接表或者邻接矩阵来存,用一个结构体存边就可以#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int N = 100010, M = 200010, INF = 0x3f3f3f3f;int n, m;int p[N];//并查集数组struct Edge{ i.
2021-05-26 22:48:06
98
原创 acwing858prim求最小生成树
#define _CRT_SECURE_NO_WARNINGS #include<cstring>#include<iostream>#include<algorithm>//prim算法和dijkstra算法类似,只不过prim算法更新的是点到已经生成的最小生成树的距离using namespace std;const int N = 510, INF = 0x3f3f3f3f, M = 100010;int n, m;int g[N][N];//稠密.
2021-05-26 17:02:05
89
原创 acwing852.spfa判断负环
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你判断图中是否存在负权回路。输入格式第一行包含整数n和m。接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。输出格式如果图中存在负权回路,则输出“Yes”,否则输出“No”。数据范围1≤n≤2000 ,1≤m≤10000 ,图中涉及边长绝对值均不超过10000。输入样例:3 31 2 -12 3 43 1 -4输出样例:Yes#define _CRT_SECURE_NO
2021-05-24 20:52:12
118
原创 acwing 851. spfa求最短路
//spfa算法从bellmanford算法用队列优化而来,bellmanford每次遍历所有的边//而spfa使用队列,将一个点的最短路径缩小的点加入队列,来遍历这个点的所有出边,降低了时间复杂度//由于SPFA算法是由Bellman_ford算法优化而来,在最坏的情况下时间复杂度和它一样即时间复杂度为 O(nm) #include<iostream>#include<cstring>#include<queue>#include<algorithm.
2021-05-24 18:09:46
113
原创 acwing 853. 有边数限制的最短路(bellman_ford算法)
//有边数限制的题且存在负权边 只能用bellman ford算法//如果路径中存在负环且在必要路径上//边权是负数适用bellmanford和spfa Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高。//如果图里存在负环,则不存在最短路径#include<iostream>#include<cstring>using namespace std;const int N=510,M=10010;struct edge{.
2021-05-23 18:45:35
226
原创 acwing 850. Dijkstra求最短路 II
#define _CRT_SECURE_NO_WARNINGS 1//堆优化版的dijkstra算法//稀疏图 用邻接表储存//主要是优化找找出最短一点的路径这一步 用堆来选择//时间复杂度O(mlogn)//建堆两种方式,1.手写堆2.优先队列//在这里用stl优先队列 priority queue#include<iostream>#include<queue>#include<cstring>#include<algorithm>.
2021-05-23 15:51:08
144
原创 acwing849 Dijkstra求最短路 I
#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=510;int n,m;int g[N][N];//g存储每条边int dist[N];//存储1号点到每个点的最短距离bool st[N];//存储某点的最短路是否已经确定int dijkstra()//时间复杂度为O(n^2){ memset(dist,0x3f,siz.
2021-05-22 21:44:49
104
原创 acwing848有向图的拓扑排序
#define _CRT_SECURE_NO_WARNINGS 1#include<algorithm>#include<cstring>#include<iostream>using namespace std;const int N = 100010;int e[N], idx, ne[N], h[N];int q[N], d[N];int n, m;void add(int a, int b){ e[idx] = b, ne[idx] = h.
2021-05-21 14:04:41
131
原创 acwing846树的重心
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 100010, M = 2 * N;//题中要求为无向图,故边的条数是节点数的二倍int n;int e[M], idx, h[N], ne[M];int ans = N;//ans保存最大子树中的最小值bool st[N];//布尔数组表示状态,当防止重复搜索void add(.
2021-05-21 12:43:55
78
原创 acwing844走迷宫(BFS)
STL#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<algorithm>#include<queue>#include<cstring>using namespace std;const int N = 110;int d[N][N], g[N][N];//d为数组保存点到起点的距离 g数组为迷宫int n, m;typedef pair<int, int&g.
2021-05-20 10:37:59
174
原创 计算机网络常见面试题(二)
解法一#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;const int N = 20;//15超 用20char m[N][N];bool col[N], dg[N], udg[N];//col列上的状态,dg对角线,udg副对角线int n;void DFS(int u)//u表上行,i表示列 每一行一定有一个皇后,所以只用对列进行判断{ if (u == n)//遍历到.
2021-05-17 20:58:39
101
原创 acwing842排列数字(DFS)
#define _CRT_SECURE_NO_WARNINGS 1//整体利用DFS的思想#include<iostream>using namespace std;const int N = 10;int path[N];//path记录当前的排列bool st[N];//bool数组st表示状态,st[i]=true表示未被使用,false表示使用过int n;void DFS(int u){ if (u == n) { for (int i = 0; i <.
2021-05-17 19:05:53
170
原创 acwing840散列表
维护一个集合,支持如下几种操作:“I x”,插入一个数x;“Q x”,询问数x是否在集合中出现过;现在要进行N次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数N,表示操作数量。接下来N行,每行包含一个操作指令,操作指令为”I x”,”Q x”中的一种。输出格式对于每个询问指令“Q x”,输出一个询问结果,如果x在集合中出现过,则输出“Yes”,否则输出“No”。每个结果占一行。数据范围1≤N≤105−109≤x≤109输入样例:5I 1I 2I 3Q 2Q
2021-05-09 16:34:09
114
原创 acwing837连通块中点的数量
//本次思路即为合并集合的稍微变形#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;const int N = 100010;int n, m;int p[N];int siz[N];int find(int x)//合并集合并且压缩路径{ if (p[x] != x) p[x] = find(p[x]); return p[x];}int main(){ scanf("%.
2021-05-06 17:45:33
105
原创 acwing836合并集

1.题目描述2.思路将传入的区间范围排序,不同区间存在三种情况,第一种,维护区间和枚举区间有交集,比如维护区间范围[1,3],枚举区间范围[2,4],此时将两区间合并为[1,4],即将维护区间的ed更新为枚举区间的en。第二种,维护区间[1,3],枚举区间[1,2],此时维护区间不变,继续枚举下一个区间。第三种,维护区间与枚举区间无交集,维护区间[1,3],枚举区间[4,5],此时将维护区间写入保存数据的vector向量中,枚举区间变成新的维护区间,并与下一个枚举区间做操作,如果此时新的维护区间为最后
2021-04-25 19:36:01
129
原创 位运算acwing801
题目描述给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。思路:考察位运算,定义一个数的二进制表示中最低位下标为0,例10101 从左到右下标一次为4 3 2 1 0右移k位&1即可得到k位数字lowbit操作:取出数字的二进制行驶中最后一个1所在位置及以后位置的数字x&-x=x(~x+1)例如:x=10000101010000~x=01111010101111~x+1=011110110000x(~x+1)=10000#define _CRT_SEC
2021-04-24 20:34:56
149
原创 acwing798.二维数组差分
题目求x1y1x2y2此矩阵c的矩阵和,x1y1处元素加c,则x1y1右下角所有元素的前缀和都+c,经历后两步-c之后,该区域正右侧和下侧多加的C被减去,而右下角被减去两次因此[x2+1][y2+1]+c#include<iostream>using namespace std;const int N=1010;int a[N][N],b[N][N];int n,m,q;int main(){ scanf("%d%d%d",&n,&m,&q);
2021-04-19 22:59:08
125
原创 acwing797.一维差分
题目输入一个长度为 n的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数 n和 m。第二行包含 n个整数,表示整数序列。接下来 m行,每行包含三个整数 l r,c,表示一个操作。输出格式共一行,包含 n个整数,表示最终序列。数据范围1≤n,m≤100000,1≤l≤r≤n,−1000≤c≤1000,−1000≤整数序列中元素的值≤1000输入样例:6 31
2021-04-19 22:02:34
155
原创 796.子矩阵的和
输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。对于每个询问输出子矩阵中所有数的和。输入格式第一行包含三个整数n,m,q。接下来n行,每行包含m个整数,表示整数矩阵。接下来q行,每行包含四个整数x1, y1, x2, y2,表示一组询问。输出格式共q行,每行输出一个询问的结果。数据范围1≤n,m≤10001≤n,m≤1000,1≤q≤2000001≤q≤200000,1≤x1≤x2≤n1≤x1≤x2≤
2021-04-16 23:08:58
364
原创 795.前缀和
数组元素 a1,a2,a3…an。前缀和:Si=a1+a2+a3+a4+a5+a6…+ai(i<=n) S0=0时间复杂度O(n)作用快速求出原数组里一段数字的和 [l,r] al—ar和为Sr-S(l-1)下标从1开始 方便处理边界 Sr-Sl-1=S10-S0 (1,10)主要理解思想题目描述输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数
2021-04-16 17:22:29
77
原创 动态内存管理一些例题
1.(非法访问内存问题)char *GetMemory(void){ char p[] = "hello world"; return p;}void Test(void){ char *str = NULL; str = GetMemory(); printf(str);}结果打印随机值,Test函数调用GetMemory函数时,GetMemory函数在栈区上开辟一段空间,内容为hello world,函数GetMemory返回指针P指向的空间的地址,但离
2021-04-16 16:33:59
232
原创 二分查找模板
二分查找模板模板1:while (l < r) { int mid = l + r >> 1;//找到中间元素 if (q[mid] >= x) r = mid;//如果q[mid]>=x 所查找的元素在mid以及mid的左侧 所以r=mid else l = mid + 1;//else 在mid的右侧 所以左边界l=mid+1 }模板2:while (l < r)//查找最后一个所查找元素的下标 { int mid =
2021-04-10 16:26:29
55
原创 归并排序母版
归并排序算法思想:1:总体采用分治的思想,找到目标数组中间元素,将数组一分为二。分别用两个指针指向左侧数组最左侧0,右侧数组最左侧mid+1。2:采用递归方法,对左侧右侧分别进行排序。3:归并。分别从两个数组的首元素开始比较大小,将较小元素放入临时数组,数组指针自增之后再比较。当一侧元素全部放入数组中而另一侧元素还有剩余时,将有剩余元素的数组一次全部放入临时数组。之后将临时数组的元素一次传入原数组即可。#define _CRT_SECURE_NO_WARNINGS 1#include<io
2021-04-09 23:03:32
49
原创 快速排序母版
算法思想1.确定分界点:选择数组元素任一元素作为分界点,分界点左侧元素小于等于该元素,分界点右侧元素大于等于该元素。一般为两端或者中间值。2.调整范围:分别用两个指针指向数组两侧,每次循环左侧指针自增,右侧指针自减,当左指针指向元素大于x时停下,当右指针指向元素小于x停下,此时交换两个元素。一直当两个指针相遇。此时确定范围,即确定左右两侧界限。3:递归处理;利用递归处理左侧元素,利用递归处理右侧元素。代码示例#define _CRT_SECURE_NO_WARNINGS 1#include<
2021-04-09 17:07:11
58
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人