自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 栈和队列标准实现

栈1. 数组实现2. 链表实现队列栈public interface MyStack<Item> extends Iterable<Item> { MyStack<Item> push(Item item); Item pop() throws Exception; boolean isEmpty(); int size();}1. 数组实现public class ArrayStack<It..

2021-03-11 12:22:04 327 27

原创 计算机操作系统 - 进程管理

进程与线程1. 进程2. 线程3. 区别进程状态的切换进程调度算法1. 批处理系统2. 交互式系统3. 实时系统进程同步1. 临界区2. 同步与互斥3. 信号量4. 管程经典同步问题1. 哲学家进餐问题2. 读者-写者问题进程通信1. 管道2. FIFO3. 消息队列4. 信号量5. 共享存储6. 套接字进程与线程1. 进程进程是资源分配的基本单位。进程控制块 (Process Control Block, PCB)..

2021-03-11 12:19:24 253 1

原创 计算机操作系统 - 链接

编译系统静态链接目标文件动态链接编译系统以下是一个 hello.c 程序:#include <stdio.h>int main(){ printf("hello, world\n"); return 0;}在 Unix 系统上,由编译器把源文件转换为目标文件。gcc -o hello hello.c这个过程大致如下: 预处理阶段:处理以 # 开头的预处理命令;编译阶段:翻译成汇编文件;汇编阶段:将汇编文件翻译成可重定位目标文件;..

2021-03-11 12:18:42 158 1

原创 计算机操作系统 - 内存管理

虚拟内存分页系统地址映射页面置换算法1. 最佳2. 最近最久未使用3. 最近未使用4. 先进先出5. 第二次机会算法6. 时钟分段段页式分页与分段的比较虚拟内存虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物..

2021-03-11 12:18:08 155

原创 计算机操作系统 - 设备管理

磁盘结构磁盘调度算法1. 先来先服务2. 最短寻道时间优先3. 电梯算法磁盘结构盘面(Platter):一个磁盘有多个盘面;磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道;扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小;磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写);制动手臂(Actuato..

2021-03-11 12:17:38 156

原创 计算机操作系统 - 死锁

必要条件处理方法鸵鸟策略死锁检测与死锁恢复1. 每种类型一个资源的死锁检测2. 每种类型多个资源的死锁检测3. 死锁恢复死锁预防1. 破坏互斥条件2. 破坏占有和等待条件3. 破坏不可抢占条件4. 破坏环路等待死锁避免1. 安全状态2. 单个资源的银行家算法3. 多个资源的银行家算法必要条件 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。占有和等待:已经得到了某个资源的进程可以再请求新的资源。不可抢占:已经分配给一个进程的资源不..

2021-03-11 12:16:36 102

原创 计算机操作系统 - 概述

基本特征1. 并发2. 共享3. 虚拟4. 异步基本功能1. 进程管理2. 内存管理3. 文件管理4. 设备管理系统调用大内核和微内核1. 大内核2. 微内核中断分类1. 外中断2. 异常3. 陷入基本特征1. 并发并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。操作系统通过引入进程和线程,使得程序能够并发运行。2. 共享共享是指系统中的..

2021-03-11 12:16:04 163

原创 Leetcode-Database 题解

595. Big Countries627. Swap Salary620. Not Boring Movies596. Classes More Than 5 Students182. Duplicate Emails196. Delete Duplicate Emails175. Combine Two Tables181. Employees Earning More Than Their Managers183. Customers Who Never Order184. De..

2021-03-11 12:13:10 124

原创 2021-03-04

一、概述正则表达式用于文本内容的查找和替换。正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。正则表达式在线工具二、匹配单个字符. 可以用来匹配任何的单个字符,但是在绝大多数实现里面,不能匹配换行符;. 是元字符,表示它有特殊的含义,而不是字符本身的含义。如果需要匹配 . ,那么要用 \ 进行转义,即在 . 前面加上 \ 。正则表达式一般是区分大小写的,但也有些实现不区分。正则表达式C.C2018匹配结果My name is CyC2018 .三、匹

2021-03-04 00:34:41 92 1

原创 你还不懂消息队列

一、消息模型点对点消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同:观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,生产者与消费者不知道对方的存在,它们之间通过频道进行通信。观察者模式是同步的,当事件触发时,主题会调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,生产者向频道发送一个消息之后,就不需要关心消费

2021-03-04 00:32:08 82 1

原创 大师系统设计基础

一、性能性能指标1. 响应时间指某个请求从发出到接收到响应消耗的时间。在对响应时间进行测试时,通常采用重复请求的方式,然后计算平均响应时间。2. 吞吐量指系统在单位时间内可以处理的请求数量,通常使用每秒的请求数来衡量。3. 并发用户数指系统能同时处理的并发用户请求数量。在没有并发存在的系统中,请求被顺序执行,此时响应时间为吞吐量的倒数。例如系统支持的吞吐量为 100 req/s,那么平均响应时间应该为 0.01s。目前的大型系统都支持多线程来处理并发请求,多线程能够提高吞吐量以及缩短响应

2021-03-04 00:31:03 84 1

原创 一文学会消息队列

一、消息模型点对点发布/订阅二、使用场景异步处理流量削锋应用解耦三、可靠性发送端的可靠性接收端的可靠性参考资料一、消息模型点对点消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同:观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,生产者与消费者不知道对方的存在,它们之间通过频道进..

2020-09-11 17:09:20 110 21

原创 一文学会正则表达式

一、概述二、匹配单个字符三、匹配一组字符四、使用元字符五、重复匹配六、位置匹配七、使用子表达式八、回溯引用九、前后查找十、嵌入条件参考资料一、概述正则表达式用于文本内容的查找和替换。正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。正则表达式在线工具二、匹配单个字符. 可以用来匹配任何的单个字符,但是在绝大多数实现里面,不能匹配换行符;. 是元字符,表示它有特殊的含义,而不是字符本身的含义。如果需要匹配 . ,那么要用 \ 进行转义,即在 ..

2020-09-11 17:08:14 432 35

原创 计算机网络(应用层)

域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议1. SMTP2. POP33. IMAP常用端口Web 页面请求过程1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面域名系统DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。 DNS 可以使..

2020-09-11 17:06:41 157 1

原创 计算机网络(物理层)

通信方式带通调制通信方式根据信息在传输线上的传送方向,分为以下三种通信方式:单工通信:单向传输半双工通信:双向交替传输全双工通信:双向同时传输带通调制模拟信号是连续的信号,数字信号是离散的信号。带通调制把数字信号转换为模拟信号。 ...

2020-09-11 17:06:17 66

原创 计算机网络(网络层)

概述IP 数据报格式IP 地址编址方式1. 分类2. 子网划分3. 无分类地址解析协议 ARP网际控制报文协议 ICMP1. Ping2. Traceroute虚拟专用网 VPN网络地址转换 NAT路由器的结构路由器分组转发流程路由选择协议1. 内部网关协议 RIP2. 内部网关协议 OSPF3. 外部网关协议 BGP概述因为网络层是整个互联网的核心,因此应当让网络层尽可能简单。网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。..

2020-09-11 17:04:20 228

原创 计算机网络(链路层)

基本问题1. 封装成帧2. 透明传输3. 差错检测信道分类1. 广播信道2. 点对点信道信道复用技术1. 频分复用2. 时分复用3. 统计时分复用4. 波分复用5. 码分复用CSMA/CD 协议PPP 协议MAC 地址局域网以太网交换机虚拟局域网基本问题1. 封装成帧将网络层传下来的分组添加首部和尾部,用于标记帧的开始和结束。 2. 透明传输透明表示一个实际存在的事物看起来好像不存在一样。帧使用首部和尾部进行定界,如果帧的数据部..

2020-09-11 17:03:41 209

原创 计算机网络(传输层)

UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制1. 慢开始与拥塞避免2. 快重传与快恢复网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。UDP 和 TCP 的特点用户数据报协议 UDP(Us..

2020-09-11 17:02:52 2301

原创 计算机网络(概述)

网络的网络ISP主机之间的通信方式电路交换与分组交换1. 电路交换2. 分组交换时延1. 排队时延2. 处理时延3. 传输时延4. 传播时延计算机网络体系结构1. 五层协议2. OSI3. TCP/IP4. 数据在各层之间的传递过程网络的网络网络把主机连接起来,而互连网(internet)是把多种不同的网络连接起来,因此互连网是网络的网络。而互联网(Internet)是全球范围的互连网。 ISP互联网服务提供商 ISP 可以从互联网管理机构..

2020-09-11 17:01:51 205

原创 什么是分布式?什么是CAP?不看你就后悔去吧

一、分布式锁数据库的唯一索引Redis 的 SETNX 指令Redis 的 RedLock 算法Zookeeper 的有序节点二、分布式事务2PC本地消息表三、CAP一致性可用性分区容忍性权衡四、BASE基本可用软状态最终一致性五、Paxos执行过程约束条件六、Raft单个 Candidate 的竞选多个 Candidate 竞选数据同步参考一、分布式锁在单机场景下,可以使用语言的内置锁来实现进程同步。但是在分布..

2020-08-13 14:13:29 2487 64

原创 《剑指offer》全解(图文结合,通俗易懂,一篇看爽)

3. 数组中重复的数字题目链接牛客网题目描述在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。Input:{2, 3, 1, 0, 2, 5}Output:2解题思路要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置

2020-07-24 19:09:31 3201 52

原创 61. 扑克牌顺子

61. 扑克牌顺子题目链接NowCoder题目描述五张牌,其中大小鬼为癞子,牌面为 0。判断这五张牌是否能组成顺子。 解题思路public boolean isContinuous(int[] nums) { if (nums.length < 5) return false; Arrays.sort(nums); // 统计癞子数量 int cnt = 0; for (int num : nums) if

2020-07-24 14:37:28 134 1

原创 60. n 个骰子的点数

60. n 个骰子的点数题目链接Lintcode题目描述把 n 个骰子扔在地上,求点数和为 s 的概率。 解题思路动态规划使用一个二维数组 dp 存储点数出现的次数,其中 dp[i][j] 表示前 i 个骰子产生点数 j 的次数。空间复杂度:O(N2)public List<Map.Entry<Integer, Double>> dicesSum(int n) { final int face = 6; final int pointNum =

2020-07-24 14:36:56 80

原创 59. 滑动窗口的最大值

59. 滑动窗口的最大值NowCoder题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组 {2, 3, 4, 2, 6, 2, 5, 1} 及滑动窗口的大小 3,那么一共存在 6 个滑动窗口,他们的最大值分别为 {4, 4, 6, 6, 6, 5}。解题思路public ArrayList<Integer> maxInWindows(int[] num, int size) { ArrayList<Integer> ret

2020-07-24 14:36:21 82

原创 58.2 左旋转字符串

58.2 左旋转字符串NowCoder题目描述Input:S="abcXYZdef"K=3Output:"XYZdefabc"解题思路先将 “abc” 和 “XYZdef” 分别翻转,得到 “cbafedZYX”,然后再把整个字符串翻转得到 “XYZdefabc”。public String LeftRotateString(String str, int n) { if (n >= str.length()) return str; char[

2020-07-24 14:35:44 78

原创 58.1 翻转单词顺序列

58.1 翻转单词顺序列NowCoder题目描述Input:"I am a student."Output:"student. a am I"解题思路题目应该有一个隐含条件,就是不能用额外的空间。虽然 Java 的题目输入参数为 String 类型,需要先创建一个字符数组使得空间复杂度为 O(N),但是正确的参数类型应该和原书一样,为字符数组,并且只能使用该字符数组的空间。任何使用了额外空间的解法在面试时都会大打折扣,包括递归解法。正确的解法应该是和书上一样,先旋转每个单词,再旋转整个

2020-07-24 14:35:13 103

原创 57.2 和为 S 的连续正数序列

57.2 和为 S 的连续正数序列NowCoder题目描述输出所有和为 S 的连续正数序列。例如和为 100 的连续序列有:[9, 10, 11, 12, 13, 14, 15, 16][18, 19, 20, 21, 22]。解题思路public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>>

2020-07-24 14:34:43 99

原创 57.1 和为 S 的两个数字

57.1 和为 S 的两个数字NowCoder题目描述输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。解题思路使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。如果两个指针指向元素的和 sum == target,那么得到要求的结果;如果 sum > target,移动较大的元素,使 sum 变小一些;如果 sum &lt

2020-07-24 14:33:58 73

原创 56. 数组中只出现一次的数字

56. 数组中只出现一次的数字NowCoder题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数。解题思路两个不相等的元素在位级表示上必定会有一位存在不同,将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。public void FindNumsAppearOnce(int[] nums

2020-07-24 14:33:26 81

原创 55.2 平衡二叉树

55.2 平衡二叉树NowCoder题目描述平衡二叉树左右子树高度差不超过 1。 解题思路private boolean isBalanced = true;public boolean IsBalanced_Solution(TreeNode root) { height(root); return isBalanced;}private int height(TreeNode root) { if (root == null || !isBalanced)

2020-07-24 14:32:56 68

原创 55.1 二叉树的深度

55.1 二叉树的深度NowCoder题目描述从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题思路public int TreeDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right));}...

2020-07-24 14:32:26 62

原创 54. 二叉查找树的第 K 个结点

54. 二叉查找树的第 K 个结点NowCoder解题思路利用二叉查找树中序遍历有序的特点。private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { inOrder(pRoot, k); return ret;}private void inOrder(TreeNode root, int k) { if (root == null || cn

2020-07-22 12:48:25 63

原创 53. 数字在排序数组中出现的次数

53. 数字在排序数组中出现的次数NowCoder题目描述Input:nums = 1, 2, 3, 3, 3, 3, 4, 6K = 3Output:4解题思路public int GetNumberOfK(int[] nums, int K) { int first = binarySearch(nums, K); int last = binarySearch(nums, K + 1); return (first == nums.length || nu

2020-07-22 12:47:56 68

原创 52. 两个链表的第一个公共结点

52. 两个链表的第一个公共结点NowCoder题目描述 解题思路设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。public ListNode FindFirstCom

2020-07-22 12:47:24 63

原创 51. 数组中的逆序对

51. 数组中的逆序对NowCoder题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路private long cnt = 0;private int[] tmp; // 在这里声明辅助数组,而不是在 merge() 递归函数中声明public int InversePairs(int[] nums) { tmp = new int[nums.length]; mergeSort(n

2020-07-22 12:46:50 65

原创 50. 第一个只出现一次的字符位置

50. 第一个只出现一次的字符位置NowCoder题目描述在一个字符串中找到第一个只出现一次的字符,并返回它的位置。Input: abaccOutput: b解题思路最直观的解法是使用 HashMap 对出现次数进行统计,但是考虑到要统计的字符范围有限,因此可以使用整型数组代替 HashMap,从而将空间复杂度由 O(N) 降低为 O(1)。public int FirstNotRepeatingChar(String str) { int[] cnts = new int[256

2020-07-22 12:46:15 106

原创 49. 丑数

49. 丑数NowCoder题目描述把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。解题思路public int GetUglyNumber_Solution(int N) { if (N <= 6) return N; int i2 = 0, i3 = 0, i5 = 0; int[] dp = n

2020-07-22 12:45:43 74

原创 48. 最长不含重复字符的子字符串

48. 最长不含重复字符的子字符串题目描述输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。解题思路public int longestSubStringWithoutDuplication(String str) { int curLen = 0; int maxLen = 0; int[] preIndexs = new int[26]; Arrays.

2020-07-22 12:45:13 80

原创 47. 礼物的最大价值

47. 礼物的最大价值NowCoder题目描述在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘1 10 3 812 2 9 65 7 4 113 7 16 5礼物的最大价值为 1+12+5+7+7+16+5=53。解题思路应该用动态规划求解,而不是深度优先搜索,深度优先搜索过

2020-07-22 12:44:40 107

原创 46. 把数字翻译成字符串

46. 把数字翻译成字符串Leetcode题目描述给定一个数字,按照如下规则翻译成字符串:1 翻译成“a”,2 翻译成“b”… 26 翻译成“z”。一个数字有多种翻译可能,例如 12258 一共有 5 种,分别是 abbeh,lbeh,aveh,abyh,lyh。实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题思路public int numDecodings(String s) { if (s == null || s.length() == 0) return

2020-07-21 11:12:44 116

空空如也

空空如也

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

TA关注的人

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