11 2019 档案
摘要:观看视频学习如何引发 OOM 和排查问题的过程, "视频" 。 通过这个视频的学习了解了不少 JVM 的知识以及 debug 的方法,记录如下。 问题 常见的 OutOfMemoryError 有三类: java.lang.OutOfMemoryError: Java heap space 堆空间
阅读全文
摘要:问题三 判断一个链表是否为回文结构 给定一个链表的头节点 head,请判断该链表是否为回文结构。 思路 第一次遍历,使用一个栈结构存储节点,第二次遍历,与弹出栈存储的值比较,相同为 true 不同为 false。 可以使用快慢指针得到链表的对称轴的下一个节点,然后将值压栈,然后重头开始遍历,省下一半
阅读全文
摘要:问题二 打印两个有序链表的公共部分 给定两个有序链表的头指针 head1 和 head2,打印两个链表的公共部分。 思路:类似于比较两个有序数组共同具有的有序部分。
阅读全文
摘要:二叉树 二叉树按层遍历打印 宽度优先遍历,通常使用队列结构。常常有 按照层数换行 的问题。 思路: 这时可以使用两个变量记录,一个是用变量 last 记录当前的 last 结点,另一个是用变量 nlast 记录下一层的 last 结点。 pop() 时添加子树,如果 pop 值等于 last 指向的
阅读全文
摘要:链表 问题一:反转单向和双向链表 分别实现反转单向链表和反转双向链表的函数。 要求:如果链表长度为 N,时间复杂度要求为 O(N),额外空间复杂度要求为 O(1)。 反转单向链表 反转双向链表
阅读全文
摘要:矩阵问题 问题一:转圈打印矩阵 给定一个整型矩阵matrix,请按照转圈的方式打印它。 要求:额外空间复杂度为O(1)。 本题可以在 "LeetCode 54 螺旋矩阵" 测试结果。 思路 定义一个方法,以左上角的点和右下角的点开始,从边界开始打印矩形。打印一圈后循环遍历内圈的矩形,直到整个矩形打印
阅读全文
摘要:需求 每天都上传代码到 GitHub 上,需要一种脚本文件自动完成一些重复的工作。 git add . git commit m "message" git push 缺点是上传的 message 都为 "auto commit",违背了代码管理的初衷,以后查看这些 message 很难知道当时修改
阅读全文
摘要:String 类 正则表达式 StringBuffer 文档说明 根据 StringBuffer 的文档说明可知: StringBuffer 是 线程安全 的,主要体现在它的方法上有 synchronized 同步锁,也因此导致其执行效率较低。 StringBuffer 虽然是线程安全的,但是其安全
阅读全文
摘要:数组 声明和初始化 错误的方式: 数组的属性 length 数组一经初始化,其长度就保持不变,通过这个属性可以轻易求出数组的长度。 数组的属性 length 数组一经初始化,其长度就保持不变,通过这个属性可以轻易求出数组的长度。 数组是一种引用类型 除基本数据类型外,其他的数据类型都是引用类型,因此
阅读全文
摘要:使用数组模拟栈和队列 使用数组模拟栈,包括栈的 push、pop 和 peek 操作。 使用队列实现栈 使用两个队列,一个是存储队列,一个是 help 队列。 helper() 将 queue 队列的数据转移到 help 队列中,只留下 queue 队列尾部的一个元素作为返回值 swap() 将 q
阅读全文
摘要:非基于比较的排序 非基于比较的排序与样本的数据状况有很大的关系,由于这个限制使其在工程中并不常用。 非基于比较的排序有桶排序,基数排序,计数排序。这三者都能做到排序的稳定性,时间复杂度为 O(n),空间复杂度为 O(n)。 问题一 计数排序和基数排序 假设存在一组数据,里面的数据只有 0 ~ 60
阅读全文
摘要:比较器 当排序不是程序的主要内容时,使用自定义比较器能够较快的实现排序目的。需要实现 Comparator 接口。 在构建 PriorityQueue 、 TreeMap 、 TreeSet 时可以传入一个比较器,这时候加入自定义数据类型就会根据制定的比较器规则进行排序。 举个例子:设计一个比较的类
阅读全文
摘要:对于 JDK 源码的一些误解 这是一篇小记录,起因是看到 Arrays 源码产生的不理解。 Arrays 内部源码居然是后来才写的,让我感到疑惑,后来想明白了,误解之处在于:一直认为 JDK 源码包内容是不能修改的;其实应该这么理解, Java 不会废除原有的特性 。 像 Python 2.x 到
阅读全文
摘要:排序算法的稳定性 排序的稳定性,指原有数据相同值的原始次序不变。 可以: 冒泡排序遇到相等的数不交换即可做到稳定。 插入排序,遇到相等的数即停止比较,插入数组。 归并排序 merge 过程中,遇到相等的值先填入左区域的值就可以做到稳定。 不可以: 选择排序不能做到稳定性,选择数值的时候交换数字是会打
阅读全文
摘要:堆排序 注意,堆这个结构需要知道什么是满二叉树、完全二叉树。堆就是完全二叉树。 堆 使用数组存储数据,用数组模拟二叉堆结构,此时下标的关系有: 父结点 i 的左子结点为 2i + 1,右子结点为 2i + 2 子结点 i 找父结点公式为:(i 1) / 2 堆分大根堆和小根堆,每一个结点为子树的最大
阅读全文
摘要:经典快排 经典快排的思路是选取数组的最后一个数 x,按照 "问题一" 的思路把整个数组划分成 两个部分,将 x 和 大于 x 部分数组的第一个元素交换位置。此时整个数组划分成 三个部分,也就是这一次排序将 x 值排好位置。 再分别对 和 中的数组递归划分,直到划分成一个数,此时所有元素也完成排序。
阅读全文
摘要:问题一 给定一个数组 arr,和一个数 num,请把小于等于 num 的数放在数组的左边,大于 num 的数放在数组的右边。 要求额外空间复杂度O(1),时间复杂度O(N)。 思路:遇到 arr[i] 小于等于 number 的数,交换 index + 1 和 arr[i],此时 index + 1
阅读全文
摘要:小和问题 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和称为小和问题。 此处使用归并排序,在 merge 时,由于左右两部分都已经有序,可以确定一侧的数都大于正在比较的数,例如: 总结 使用归并排序算法的快速之处在于,归并的两个部分对内都是有序的,如 两个部分
阅读全文
摘要:异常 throw 和 throws 的区别 语句之后的代码无法再运行,此时 Eclipse 会显示 错误。 在 FileInputStream 的构造方法中可以看到,该方法抛出了一个异常,可以有两种处理方式:一是在调用该方法的另一个方法继续 throws FileNotFoundException,
阅读全文
摘要:冒泡排序 冒泡排序比较简单,但是容易出现冗余的循环,即使是一个已经排序的数组传入仍然需要遍历 O(n ^ 2)。 选择排序 选择排序时间复杂度也是 O(n ^ 2)。 插入排序 插入排序,有可能是 O(n) 也有可能是 O(n^2),和数据是否已经有序有关。 希尔排序 归并排序使用了递归的方式,利用
阅读全文
摘要:面向对象 面向过程和面向对象 面向过程注重过程,犹如烧水喝茶的过程,先煲水,再冲茶。面向对象则是将这个过程参与者看做对象,有人的动作倒水,有水壶的动作烧水,有人的动作冲茶。将这个过程归类 class 成为一个个对象 Object,对象有方法 Method 和属性 field。 过程固定,则灵活性不高
阅读全文
摘要:GitHub 自动构建 GitHub 项目的 README.md 目录 本文适合支持 Markdown 语法的文本的自动化目录构建。 结果 目录自动生成,可自动化更新。 过程 准备工具 Sublime Text3 插件 MarkdownTOC: "https://github.com/naokazu
阅读全文
摘要:购买阿里云服务器 学生版有两种: 1. 学生专享 限24周岁以下/阿里云云服务器ECS/专业运维 2. 学生专享 限24周岁以下/阿里云轻量服务器/简单易操作。 为啥选择轻量应用服务器 标题写明 专业运维 和 简单易操作 ,既然是初次搭建网站,选择容易上手的服务器更佳。就配置而言应付日常练习应该够用
阅读全文
摘要:查看 sshd 服务状态 sshd 服务开启时可以使用 Xshell 等工具使用 ssh 方式远程连接 终端输入 查看状态,如果没有开启,进入下一步 开启 sshd 服务 服务开启: 1. 打开终端 2. 输入 命令 3. 查看 系统服务 选项 4. 找到 sshd 选项,查看是否开启, 为开启 注
阅读全文
摘要:语言基础 基本概念 关键字: 51 个,可以参考 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html Here is a list of keywords in the Java programming l
阅读全文

浙公网安备 33010602011771号