自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

笨手笨脚°的博客

一名在学习的萌新

  • 博客(87)
  • 收藏
  • 关注

原创 PriorityQueue实现最小堆和最大堆的用法[JAVA]

一、基本介绍1、介绍PriorityQueue翻译为优先队列,“优先”指元素在队列中按一定的顺序(优先级)进行存放,“队列”指一种先进先出的数据结构。因此PriorityQueue可以实现按照一定的优先级存取元素。2、用法从源码来看PriorityQueue的构造方法://默认容量为 11private static final int DEFAULT_INITIAL_CAPACITY = 11;//1、无参构造,默认容量和默认排序方法public PriorityQueue() {

2021-06-27 10:25:23 1062 2

原创 常用排序算法代码实现(java)

归并排序: public static void mergeSort(int nums[]){ mergeSort(nums,0,nums.length - 1); } private static void mergeSort(int[] nums, int left, int right) { //排序 if(left >= right) return; int mid = left + (right -.

2021-06-16 23:57:09 196

原创 编写10个线程,第一个线程从1加到10,第二个线程从11加到20…第十个线程从91加到100, 最后再把10个线程结果相加。

在面试中没当场写出来的题,记录一下:主线程中:public class Main { public static void main(String[] args) throws Exception{ int start = -9; for(int i = 0;i < 10; i++){ start += 10; Thread t = new Thread(new Add(start));

2021-06-15 17:42:14 1283 2

原创 【计网实验】实验八:聊天程序(Java)

实验目的不过最后的验收只要能实现功能就可以,不限制使用的语言。所以我是用java来实现的。项目技术栈数据库:mysql后台框架:springboot + mybatis前端:html + css + js + ajax页面展示登录:注册:聊天室:项目结构...

2021-05-26 15:41:11 726 2

原创 【计网实验】实验三:TCP Tahoe与Reno 运行机制对比分析

实验目的学习TCP的拥塞控制机制并了解TCP Tahoe和TCP Reno协议的运行机制。实验过程一、安装NS2NS2(Network Simulator 2)必须在UNIX/Linux平台下运行。若要在Windows下使用NS可以采用Windows+虚拟机(VMware、Virtual PC)+NS组合的方式,或者是Windows+Cygwin(一个模拟的Linux平台)+NS组合的方式。这里,我们直接在Linux环境下使用。...

2021-05-07 17:09:56 1317

原创 【数据结构复习】二叉树常用方法

本篇文章主要是用代码记录二叉树的一些常用方法,如建立BST、前中后序遍历二叉树等,持续补充,方便自己之后复习。package dataStruct.tree;import java.util.Random;class BinaryTree{ //节点类 class TreeNode{ //成员变量:一个树节点you数据域和两个儿子指针组成 int val; TreeNode left; TreeNode right; .

2021-04-28 18:48:39 133

原创 【复习】java并发和多线程

1、线程和进程的关系线程是CPU调度的最小单位,进程是资源分配的最小单位,进程类似于线程的容器。题外话:进程通信的方式2、创建线程的方式继承Thread类,重写run方法。实现Runnable接口,重写run方法,无返回值,Runnable作为Thread的参数进行执行。实现Callable接口,重写call方法,有返回值,Callable作为FutureTask的参数,FutureTask作为Thread的参数进行执行。3、用start()和run()来启动线程的区别。start

2021-04-02 13:38:26 92

原创 【复习】Java集合框架 - Hashmap和Treemap的区别

Java集合框架Java集合框架Collection:存储单列数据List :存储有序、可重复的数据ArrayList:常用,查找效率高,线程不安全,底层的数据结构是数组。LinkedList :插入和删除的效率高,线程不安全,底层的数据结构是双向链表。Vector:1.0就出现了,线程安全,效率没有ArrayList高,底层的数据结构也是数组,扩容时一般是扩容为当前容量的两倍。Set :存储无序、不可重复的数据。HashSet:线程不安全,底层是数组+链表,也就是使用链地址法

2021-04-02 13:10:59 153

原创 【计网实验】实验二 :网络基础编程实验(JAVA)

实验目的通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。实验过程1、用TCP进行数据发送的简单程序流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。程序概述:客户端与服务器之前能进行轮流信息交换,当各自回复"bye"则关闭自身,当客户端回复"ok"则关闭服务器。参考教程:基于JAVA的Socket类的TCP网络编程客户端代码:package com.mwx.tcp;import java

2021-03-28 17:37:40 1436 1

原创 【计网实验】实验一 :应用协议与数据包分析实验(使用Wireshark)

实验目的通过本实验,熟练掌握Wireshark的操作和使用,学习对HTTP协议进行分析。实验步骤1、下载安装Wireshark;2、在cmd中输入命令“ipconfig”,得到本机IPv4 地址;3、开启抓包,访问 www.china.com,页面加载完毕之后停止抓包。抓包结果如下:4、利用显示过滤器进行筛选,选择有用信息进行分析。报文分析1、综合分析截获的报文,查看有几种HTTP 报文?有两种报文,一种是HTTP请求报文,如上序号为19的报文;一种是HTTP响应报文,如上序号为21的报

2021-03-28 14:51:32 2637

原创 【56】用两个栈实现队列 | 斐波那契数列

用两个栈实现队列问题描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )解题思路栈:后进先出队列:先进先出直接看来自官方的图解:使用两个栈,栈1用来存储新数据,栈2用来将栈1的数据进行反转,以达到先进先出的目的。具体为:当 appendTail时直接将数据存入栈1,当deleteHead时先检查栈2是否有元素,若有则弹栈

2021-03-18 17:51:50 450

原创 【55】重建二叉树

重建二叉树问题描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例子:解题思路前序遍历的顺序是:中左右中序遍历的顺序是:左中右所以,可以由前序遍历找到子树的根节点,根据中序遍历分出左子树和右子树,在子树中按照同样的方法来还原二叉树,由此,可看出能够用递归来完成此题。比如例题中的:由前序遍历数组得到根节点是3,在中序遍历数组中得到3的左边[9]是左子树,3的右边[15,20,7]是右子树。在3的左子树中由前序遍历数组可知根节点是

2021-03-17 23:46:17 82

原创 【54】替换空格 | 从尾到头打印链表

替换空格问题描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。解题思路遍历字符串,若发现空格则令新的字符串等于空格前的一段 + “%20” + 空格后的一段。class Solution { public String replaceSpace(String s) { for(int i=0; i<s.length(); i++){ if(s.charAt(i) == ' '){ s = s.sub

2021-03-16 12:45:31 64

原创 【53】(HashSet)数组中重复的数字 | 二维数组中的查找

数组中重复的数字问题描述找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。解题思路将数组中的元素加入到hash表中,一边加入一边判断表中是否有相统元素,若有,则返回正在加入的这个元素。class Solution { public int findRepeatNumber(int[] nums) { Map<I

2021-03-15 15:59:58 380 1

原创 【52】 3的幂 | 爬楼梯(LC 326 | 70)

3的幂问题描述给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x。提示:-231 <= n <= 231 - 1进阶:你能不使用循环或者递归来完成本题吗? 见题解。解题思路class Solution { public boolean isPowerOfThree(int n) { if(n <= 0) // 3的幂次方不可能

2021-03-14 17:23:29 113

原创 【51】(HashMap)字母异位词分组(LC 49)

字母异位词分组问题描述给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。例子:解题思路我所想到的是一个中规中矩的思路:将字符串数组中的每两个字符串一一进行判断,若这两词还没有加入过某一List,且是异位词则加进同一List中。判断两个字符串是否为异位词的方法:首先,若两字符串长度不等,则肯定不是异位词;若长度相等,则将字符串a的每一个字符作为hashmap的key,该字符出现的次数作为value存入hashmap中,然后再遍历字符串b的每个字符,若该字符能在h

2021-03-13 22:25:42 100

原创 【50】(动规)最长回文子串(LC 5)

最长回文子串问题描述给你一个字符串 s,找到 s 中最长的回文子串。解题思路之前做过这道题的类似题:最长回文子序列。不同的是那道题返回的是最长回文子序列的长度,而这题返回最长回文子串,即返回值为String类型。虽然返回值不同,但要求是一样的,因此这题我们也可以用动态规划来求解:对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。我们用dp(i,j) 表示字符串 s 的第i 到 j 个字母组成的串是否为回文串,如果s[i,j]是回文串,则说明s

2021-03-12 12:50:21 75

原创 【49】(二分法)寻找两个正序数组的中位数(LC 4)

寻找两个正序数组的中位数问题描述给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?解题思路找一个有序数组的中位数可以直接在O(1)时间完成:判断数组长度,若为偶数则取中间两数的平均值,若为奇数则取中间值。因此可以想到先把两数组合并再求中位数,因此此题的考点变成了如何合并两个有序数组,使用归并排序,时间复杂度是O(m+n)(疲惫)直接贴写的好的题

2021-03-11 21:48:15 252

原创 【48】(动规)最大子序和 | 最后一个单词的长度 | 加一(LC 53 | 58 | 66)

最大子序和问题描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。解题思路要得到前n个元素的连续最大和,必定与前n-1个元素的连续最大和有关,由此可看出此题能用动态规划求解,定义dp[i]为以nums[i]结尾的连续最大和,若已知dp[i-1],则dp[i] = Math.max(dp[i-1]+nums[i],nums[i]) ,最终的结果就是值最大的dp[i]。class Solution { public int maxSubAr

2021-03-10 18:12:00 81

原创 【47】(双指针)移除元素 | (二分查找)搜索插入位置(LC 27 | LC 35)

移除元素问题描述给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。解题思想这题与昨天的题(删除排序数组中的重复项)是同类型的题,所以依然可以使用双指针来解题,只是注意这里的两个指针都是从0号位置开始的。还有两个注意点,已在代码中标明:class Solution { public

2021-03-09 17:35:44 55

原创 【46】(快慢指针)删除排序数组中的重复项(LC 26)

删除排序数组中的重复项问题描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。注:这里返回的是数组的新长度length,输出就输出前length个数字,所以需要把前面重复的元素用不重复的元素替换掉。例子:解题思路根据题解,将采用快慢指针的思想,快指针指向新数组的最后一个元素,慢指针按顺序遍历原来数组的元素,当快慢指针所指元素不相同时就将慢指针所

2021-03-08 23:53:36 142

原创 【45】最长公共前缀(LC 45)

最长公共前缀问题描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。解题思路把第一个字符串的字符作为标杆,逐个比较,若其他字符串的相应位置的字符与标杆不相等或者长度不够就返回当前得到的结果。class Solution { public String longestCommonPrefix(String[] strs) { int n = strs.length; String res = "";

2021-03-07 23:01:26 73

原创 【44】(BFS) 岛屿数量(LC 200)

岛屿的数量问题描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。例子:解题思想此题我是用于对BFS的练习,所以使用了BFS的解法:首先对数组进行遍历,若检测到1则将其标记为0,表示访问过,再利用BFS找出其竖直和水平线上的领域,并标记为0,每次第一次检测到1就将岛屿数量+1,整个遍历完后就得到了岛屿的数量。class Soluti

2021-03-05 10:45:23 249 1

原创 【43】(BFS)打开转盘锁(LC 752)

BFSBFS:宽度优先搜索,每次扩展最浅的为扩展结点。之前在学习算法分析这门课的时候对分支界限法有些模糊不清,现在和回溯法对比着来看,突然清晰了。回溯法:用DFS遍历解空间树,用于求出所有可能解,可用栈实现;(栈模拟递归)分支界限法:用BFS遍历解空间树,用于求出一个最优解,用队列实现。算法模板:(模板出处)// 计算从起点 start 到终点 target 的最近距离int BFS(Node start, Node target) { Queue<Node> q; //

2021-03-04 20:00:24 123 2

原创 【42】 (回溯法)括号生成(LC 22)

括号生成问题描述数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。例子:解题思路使用回溯法穷举,使用One_of_ans[2*n]数组来存储结果,若One_of_ans[i]为0则为右括号,若One_of_ans[i]为1则为左括号,遍历子集树得到可行解,再根据One_of_ans[]转化为字符串得到本题答案。代码...

2021-03-03 13:15:58 174

原创 【41】回溯法——全排列 | N皇后问题(LC 46 | 51)

回溯算法详解解决一个回溯问题,实际上就是一个决策树的遍历过程。两种决策树的遍历:如上,参数t为当前在决策树的层数。子集树:针对在解向量中选择满足条件的子集),如背包问题;排列树:针对解向量的排序问题,如全排列、八皇后问题。全排列问题问题描述给定一个 没有重复 数字的序列,返回其所有可能的全排列。解题思想很明显该问题是一个解向量的排序问题,可以直接套用遍历排列树的模板:class Solution { public List<List<Integer>>

2021-03-02 22:19:55 235

原创 【40】最长公共子序列 | 编辑距离(LC 1143 | 72)

最长公共子序列问题描述给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace"是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。若这两个字符串没有公共子序列,则返回 0。解题思路定义dp[i][j]为在字符子串text

2021-03-01 20:05:44 205

原创 【39】(动态规划——子序列解题模板) 最长递增子序列 | 最长回文子序列(LC 300 | 516)

动态规划——子序列解题模板1、一维的 dp 数组模板:int n = array.length;int[] dp = new int[n];for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { dp[i] = 最值(dp[i], dp[j] + ...) }}dp[i]的含义: 在子数组array[0…i]中,以array[i]结尾的目标子序列的长度是dp[i]。(类似如此)例子

2021-02-28 22:57:18 195 1

原创 【38】斐波那契数 | 凑零钱问题(LC 509 | 322)

动态规划动态规划详解解题思路将待求解问题分解成若干个不独立的子问题,求出子问题的解并记录在表中,当需要再次求解此子问题时,可以通过查表获得该子问题的解而不用再次求解,从而避免了大量的重复计算。最后结合这些子问题的解即可得到原问题的解。解题步骤:①分析问题的最优子结构性质:一个最优策略的子策略总是最优的②建立递归关系(状态转移方程)建立状态转移方程:明确「状态」 -> 定义 dp 数组/函数的含义 -> 明确「选择」-> 明确 base case。③自下而上计算最优值

2021-02-13 18:54:10 134

原创 【37】最小栈 (LC 155 )

最小栈问题描述设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。题解我以为题目是让用基础的数据结构实现一个栈,所以我用了数组来实现:class MinStack { int cur = -1 ; int minnum = Integer.MAX_VALUE ; int a[] =

2021-02-10 21:44:16 193

原创 【36】分割回文串 | 有效的字母异位词(LC 131 | 242)

分割回文串问题描述给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:题解回溯法回溯法:用深度优先搜索来实现的优化的穷举法。模板:递归回溯:void backtrack (参数){ if (终止条件) output(); else{ for (int i=f(n,t);i<=g(n,t);i++) { 处理节点; if (constraint()&&bound()) backtrack();//

2021-02-09 21:07:08 86

原创 【读书笔记】第三章:JDK并发包——《实战Java高并发程序设计》

第三章:JDK并发包3.1 多线程的团队协作:同步控制3.2 线程复用:线程池3.3 不要重复发明轮子:JDK的并发容器3.4 使用JMH进行性能测试

2021-02-09 12:26:44 118

原创 【35】只出现一次的数字 | 多数元素(LC 136 | 169)

从今天开始用java刷题。只出现一次的数字问题描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?题解hash表附加知识点:Map集合基于 键(key)/值(value)映射。每个键最多只能映射一个值。键可以是任何引用数据类型的值,不可重复;值可以是任何引用数据类型的值,可以重复;键值对存放无序。HashMap常用方法:put(K key, V valu.

2021-02-08 18:49:45 104 1

原创 【34】无重复字符的最长子串(LeetCode 3)

无重复字符的最长子串问题描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。解题思想unordered_set的使用:unordered_set<int> c1; //定义c1.empty();//判断是否为空c1.size(); //获取元素个数 size()c1.max_size(); //获取最大存储量 max_size()c1.find(key);//调用 unordered_set 的 find() 会返回一个迭代器。这个迭代器指向和参数哈希值匹配

2021-02-06 22:05:30 58 1

原创 【数据结构复习】散列表(Hash table)

所有图片来自数据结构与算法基础(青岛大学-王卓)的PPT,顺便安利一波,老师的课讲的很好,墙裂推荐!散列表一、概念1、散列表的定义散列表,是根据关键码值而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列函数:H(key) = Addr .例:如上,给定散列函数H(key) = key,若给定key = 9,则由散列函数算出地址为 9,也就是9应该存在散列表的9号位置。2、散列表的相关

2021-02-06 17:25:03 281

原创 【读书笔记】第二章:Java并行基础——《实战Java高并发程序设计》

第二章:Java并行基础2.1 进程和线程2.2 线程的基本操作2.3 volatile与Java内存模型(JMM)2.4 线程组2.5 守护线程2.6 线程优先级2.7 线程安全的概念与关键字synchronized2.8 程序中隐蔽的错误

2021-02-05 17:19:53 87

原创 【33】排序链表 | 相交链表(LeetCode 148 | 160)

排序链表问题描述给你链表的头结点 head ,请将其按 升序排列 并返回排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?解题思路看到时间复杂度O(nlogn),第一想法就是快速排序,但是指针并不能前移,所以在这题中不能用快速排序。而应该用归并排序。如果要达到题目要求的常数时间的空间复杂度,就用迭代来实现。关于归并排序见合并排序(归并排序)-分治法-计算机算法。先来看递归的方法:找到链表的中间结点mid;(可用快慢指针,也可求出链

2021-02-05 14:29:59 102

原创 【读书笔记】第一章:走进并行世界——《实战Java高并发程序设计》

第一章:走进并行世界1.1 并行计算的历史1.2 概念同步:同步方法一旦开始,调用者必须等到方法调用返回后才能继续后续的行为;异步:异步方法通常会在另一个线程中“真实”地执行,整个过程不会阻碍调用者的工作。并发:多个任务交替进行(但对外部观察者来说看起来就行多个任务“同时进行”);并行:多个任务同时进行。临界区:公共资源(共享数据)。阻塞:一个线程被挂起,等待其他线程释放临界区资源,在等待的时候就是被阻塞状态;非阻塞:与“阻塞”相反,只某个线程没有受到任何阻

2021-02-04 17:36:17 113

原创 【32】重排链表 | 对链表进行插入排序(LeetCode 143 | 147)

重排链表问题描述给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。例子:解题思路第一个想到的就是分离再合并的方法:①将链表分成前部分和后部分;②将后部分反转顺序;③合并前后部分。示意图:代码:/** * Definition for singly-linked list. * struct ListNode { * int val;

2021-02-04 12:53:00 76

原创 【31】环形链表 | 环形链表 II(LeetCode 141 | 142)

环形链表问题描述给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?解题思路第一个想法就是沿着next遍历

2021-02-03 12:39:37 107

空空如也

空空如也

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

TA关注的人

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