Java
文章平均质量分 76
和风与影
大数据程序员
展开
-
【Java】Java 基础常考题
基础原创 2022-08-20 17:33:17 · 135 阅读 · 0 评论 -
【Java】Java 并发常考题
java 并发原创 2022-08-18 15:18:56 · 277 阅读 · 0 评论 -
【Java】Java 虚拟机常考题
java原创 2022-08-08 10:28:59 · 318 阅读 · 0 评论 -
【Java】Java 高频面试题英语版(1)
Java原创 2022-07-04 15:40:25 · 3493 阅读 · 0 评论 -
Java 算法刷题指南
目前感觉比较好的刷题方式就是按照《算法笔记》的框架进行刷题。尽量将每种题型的模板背下来,经常默写。下面给出框架。1.基础1.1 输入输出CSDN:笔试面试中的输入输出公众号:笔试面试中的输入输出1.2 数学问题CSDN:常见数学问题公众号:常见数学问题1.3 Java 的常用集合CSDN:常用集合公众号:常用集合2.数据结构2.1 栈CSDN:Java 中栈的使用公众号:Java 中栈的使用2.2 队列CSDN:Java 中队列的使用公众号:Java 中队列的使用2.原创 2022-05-02 15:21:22 · 2091 阅读 · 0 评论 -
【算法】动态规划-背包问题
动态规划就是将问题划分为子问题,通过子问题的最优解得到原问题的最优解。动态规划把每个求解过程的子问题记录下来,下次碰到同样的子问题可以直接使用之前的结果。下面学习一类经典的背包问题。1.01背包问题问题是这样的:n 件物品,每个重量 w[i],价值 c[i] 。背包容量 V。问如何使得背包内物品总价值最大。每种物品只有一件。定义 dp[i][j] 表示前 i 件物品装入容量 j 的背包的价值,那么:dp[i][j] = Math.max( dp[i-1][j], // 不放第 i 件物品原创 2022-04-28 12:14:26 · 467 阅读 · 0 评论 -
【算法】拓扑排序
今天学习拓扑排序。如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图(Directed Acyclic Graph,DAG)。拓扑排序就是将有向无环图的所有顶点排序,使得图中任意两个点 u、v,只要存在边 u → v,那么拓扑排序中 u 一定在 v 前面。例如,高等数学、线性代数都可以直接开始学习,复变函数要学习完前两门课才能学习,所以,拓扑排序可以是:高等数学→线性代数→复变函数,或者线性代数→高等数学→复变函数。下面讲解具体算法的思路。1.拓扑排序算法基本思想如下原创 2022-04-26 08:55:37 · 1916 阅读 · 0 评论 -
【算法】图的最短路径-Dijkstra算法(Java)
图的最短路径常用算法有 Dijkstra 算法,Bellman-Ford 算法,SPFA 算和 Floyd 算法。今天先学习 Dijkstra 算法。1.Dijkstra 算法迪杰斯特拉算法,用来解决单元最短路问题,用于求 s 到其他所有顶点的最小路径。基本思想是,对于图 G(V, E),V 是顶点,E 是边。设置集合 S 存放已经访问过的节点。每次从 V 减去 S(也就是没访问的节点)中选择与起点 s 距离最短的点 u,加入集合 S。以 u 为中介点,优化起点 s 与所有从 u 能到达的顶点 v原创 2022-04-25 11:15:02 · 1554 阅读 · 1 评论 -
【算法】图的存储和遍历(Java)
今天学习图的存储和遍历。1.图的存储图的存储一般采用领接矩阵和邻接表。这里讲解邻接表。简单来说,邻接表就是每个顶点定义一个列表,记录该顶点的所有出边。这里可以用 ArrayList 来存储每个节点的出边。// 邻接表List<List<Integer>> edges = new ArrayList<>();// 每个节点 new 一个 List 存放出边for (int i = 0; i < n; i++) { edges.add(new A原创 2022-04-24 13:53:23 · 1147 阅读 · 0 评论 -
【堆】堆的实现(Java)
今天学习堆这种数据结构。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。1.用优先队列实现一般我们直接用优先队列实现堆:// 小顶堆,以 Integer 为例PriorityQueue<Integer> pq = new PriorityQueue<>();// 大顶堆PriorityQueue<Int原创 2022-04-23 14:13:37 · 2303 阅读 · 2 评论 -
【算法】并查集(Java)
今天学习一种新的数据结构并查集。“并”表示合并,“查”表示查找,“集”表示集合。其基本思想是用 father[i] 表示元素 i 的父节点。例如 father[1] = 2 表示元素 1 的父节点是 2。如果 father[i] = i,那么说明 i 是根节点,根节点作为一个集合的标识,如下图表示两个集合,它们的根节点分别是 1 和 5。当然,如果不使用数组来记录,而使用 map 来记录,那么可以使用 father.get(i) = null 来表示根节点。1.并查集的基本操作下面定义了并查集的类原创 2022-04-22 13:27:58 · 4754 阅读 · 2 评论 -
【算法】二叉搜索树的基本操作
二叉搜索树是一棵数据有序的树,对于树上的每个节点,左子树的所有节点的数值都小于根节点,右子树的所有节点的数值都大于根节点。下面讲解几种二叉搜索树的基本操作。1.查找操作查找操作很简单,通过要查找的值和根节点对比,可以得到如下的查找过程:根节点为空,查找失败;root.val == val,查找成功;root.val > val,到左子树查找;root.val < val,到右子树查找。查找的最坏时间复杂度是 O(h),h 是树高。查找的代码如下:public TreeNo原创 2022-04-21 13:24:07 · 645 阅读 · 0 评论 -
【算法】二叉树的层序遍历
昨天介绍了二叉树的前序、中序、后序遍历,今天介绍一下二叉树的层序遍历。层序遍历需要一个数据结构来存储二叉树的每一层,然后从左到右依次遍历,满足先进先出,因此使用 Queue 来存储每一层最为合适。层序遍历本质上和 BFS 一样,因此这里可以直接使用前面讲过的 BFS 模板。public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new转载 2022-04-20 11:25:37 · 203 阅读 · 0 评论 -
【算法】二叉树的非递归前序遍历、中序遍历、后续遍历
二叉树的遍历一般又四种:先序遍历(前序)、中序遍历、后序遍历和层次遍历。1.先序遍历 访问过一个节点就不会返回,所有需要一个数据结构将它的孩子节点保存起来。由于左子树的所有节点都比右子树先访问,所以当前访问的节点的左孩子的孩子节点都会比当前访问节点的右孩子先访问,而左孩子的孩子节点肯定比右孩子后保存进入数据结构,但要先被访问,满足后进先出,使用栈。具体的解法如下:public List<Integer> preorderTraversal(TreeNode root) { L原创 2022-04-19 14:28:01 · 278 阅读 · 0 评论 -
【算法】广度优先搜索(BFS)
昨天学习的深度优先搜索是走到岔路口,选择一条路走到头才返回,然后选择其他岔路继续前进。而广度优先搜索则是走到岔路口后,先按顺序访问当前岔路口能直接到达的所有节点,然后再按访问节点的顺序去访问它们能直接到达的节点。由于是按层次遍历的,所以可以解决一些最短路径的问题。而深度优先搜索可以解决一些求所有解的问题。 BFS 一般借助队列来实现,下面给出 BFS 的模板写法: private void bfs() { // 定义队列 Queue<Object> queue =转载 2022-04-18 11:52:05 · 395 阅读 · 0 评论 -
【算法】深度优先搜索(DFS)
深度优先搜索是笔试面试中重点考察的内容。今天来讲解深度优先搜索的思想。这里推荐阅读《算法笔记》这本数,对考研机试和找工作中笔试面试常考算法都进行了通俗的讲解。公众号回复 801 获取 pdf。 深度优先搜索的思路很简单,以当前位置为起点,沿着一条路向前走,遇到岔路口,选择一条岔路前进。如果选择的这个岔路是死路(遇到了递归边界),那么就退回到刚刚的岔路口,选择另一个岔路口前进。如果岔路中存在新的岔路,那么也按照刚刚的方法枚举。这样一定能找到出口(目标解存在的情况下)。由于这种方法是不到死路(递归边界)原创 2022-04-17 15:53:43 · 1202 阅读 · 0 评论 -
【算法】Java 中链表的基本操作
链表是一种重要的数据结构,在工程项目中广泛使用。对于链表,要搞清楚是否有头节点,即第一个节点不存任何数据,只是表示链表的头部,而首节点才是链表第一个真正存放数据的节点。通常情况下,对有头节点的链表进行操作比较方便。如果原来的链表没有头节点,可以 new 一个 dummyHead 作为头节点,这样往往能减少大量边界条件的判断。下面通过几个例题来学习链表。1.力扣206.反转链表[1]给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5原创 2022-04-16 15:21:43 · 2443 阅读 · 0 评论 -
【算法】Java 中队列的使用
队列是一种先进先出的数据结构,在算法题中应用广泛。今天也通过几个例题来学习 Java 中队列的使用。1.力扣225.用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元素。 int top() 返回栈顶元素。 boolean empty() 如果栈是空的,返回 true ;否转载 2022-04-15 11:47:45 · 1577 阅读 · 0 评论 -
【算法】Java 中栈的使用
栈是一种重要的数据结构,满足后进先出,是面试中会重点考察的内容。下面通过例题来学习栈的使用。1.力扣20.有效的括号[1]给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1: 输入:s = “()” 输出:true示例 2: 输入:s = “()[]{}” 输出:true示例 3: 输入:s = “(]” 输出:false括号原创 2022-04-14 23:26:12 · 539 阅读 · 0 评论 -
【算法】Java 中常用的集合类
想要熟练写出算法题,必须要做到对 java 中的集合做到熟练使用。java 中的集合实现了各种数据结构,我们可以直接使用这些数据结构,更加专注与解决算法问题而不是实现这些数据结构。 集合主要分为两大类,包括 Collection 和 Map,Collection 表示一组对象,Map 表示一组映射关系或键值对。下图是 Collection 之间的继承和实现关系:下图是 Map 之间的继承和实现关系:1.Collection 常用功能 Collection是所有单列集合的父接口,因此在原创 2022-04-13 17:50:39 · 379 阅读 · 0 评论 -
【算法】递归算法的写法
递归是算法考试中常用的解题方法,其核心思想在于反复调用自身,把问题的规模缩小,直到缩小到可以直接得到答案的边界条件,然后在函数返回的过程中逐步求解。递归解法核心分为两部分,一是递归的边界条件,二是递归调用。下面通过递归的常考题目来感受递归调用的过程。1.力扣46.全排列[1]给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],原创 2022-04-12 18:07:38 · 1556 阅读 · 0 评论 -
【算法】二分查找详解
二分是算法考察中的重要内容,通常用于在有序数组中进行查找,可以将时间复杂度从O(n)降至O(logn)。二分的思想十分简单,下面给出几种常见问题的模板写法。1.二分查找在递增数组中元素不重复,要求查找元素 x,查找成功返回 x 的下标,查找失败返回 -1。public int binarySearch(int[] nums, int x) { int left = 0, right = nums.length - 1; while (left <= right) { // l原创 2022-04-11 20:18:34 · 226 阅读 · 0 评论 -
【算法】面试笔试中的贪心算法
贪心算法是面试中的常考问题。它是在考虑局部最优解的情况下来得到全局最优解,即一个问题的最优解可以由它的子问题的最优解构造出来,一般使用反证法和数学归纳法来证明。贪心算法没有固定的模板,是一种思想。通常贪心算法都需要对原始数据进行排序,或者问题本身已经是一个序列,只需要在这个序列上对每一步做出决策。下面通过几个问题来体会贪心策略的思想。1.力扣 179.最大数[1]题目描述: 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以原创 2022-04-11 10:49:15 · 1185 阅读 · 0 评论 -
【算法】面试中的常见排序算法
排序算法不但是算法考试的重点,也是面试中经常会问到的问题。对于常见的算法,不但要能熟练写出,还要明白其时间复杂度、空间复杂度、稳定性以及适用的场景。1.快速排序算法思想:选择一个主元,比主元小的放在一边,比主元大的放在另外一边。让后对两边分别递归使用快速排序。时间复杂度:平均时间复杂度 O(nlog2n)最好时间复杂度 O(nlog2n)最坏时间复杂度 O(n2)空间复杂度:O(nlog2n)稳定性:不稳定适用场景:寻找数组中的第 K 大数。Partition得原创 2022-04-10 15:54:46 · 664 阅读 · 0 评论 -
【算法】笔试面试中的常见数学问题
算法中数学问题经常考察。各种常见的数学算法需要牢记于心,经常默写。这种题思路比较简单,但是没有提前的准备和练习,关键时刻很难一次正确写出。下面给出几种常见的数学问题的模板解法。这里强烈推荐看《算法笔记》这本书。1.进制转换 平常使用的数据都是十进制,计算机使用的是二进制。在考察过程中可能有一些特殊的进制需要处理。一般的,对于一个 P 进制的数,要转换为 Q 进制,可以分两步:将P进制数 x 转换为十进制数 y: 设P=a1a2...anP=a_1a_2...a_nP=a1a2.原创 2022-04-09 12:57:54 · 988 阅读 · 0 评论 -
【算法】面试中手撕代码的输入输出(Java)
输入输出正确是做对题的第一步。原创 2022-04-08 17:07:45 · 1370 阅读 · 0 评论