大厂面试算法指南
leetcode刷题指南
天下第一小白
作者目前就职于某大厂,研究方向是深度学习领域,微服务等。对算法和数据结构比较感兴趣,经常会分享一些leetcode题解和面试知识,希望我的博客能够帮您解决问题,提升自己,今天很高兴认识你。
展开
-
关于字节面试过程不会的算法题总结
这个题目拿到手,我想到的就是把它转为String,然后对string用默认的字典序排序算法,显然忽视了当n取极限值10^9时带来的内存问题。一开始的解法:class Solution { public int findKthNumber(int n, int k) { ArrayList<String> list = new ArrayList<>(); for(int i = 1; i<=n; i++){ .原创 2021-10-09 10:59:03 · 374 阅读 · 1 评论 -
关于树的几道面试题目
class Solution { int ret = 0; public int diameterOfBinaryTree(TreeNode root) { deepth(root); return ret; } public int deepth(TreeNode root){ if(root == null) return 0; int left_max = deepth(root.left); .原创 2021-09-21 18:45:14 · 120 阅读 · 0 评论 -
关于面试时碰到的几个多线程手撕代码题
总结秋招和实习面试的时候碰到的几个手撕的多线程代码题:问题一:三个线程循环打印ABC,线程一打印A,线程二打印B,线程三打印C,打印10遍即可。这个问题主要是考察怎么使用线程同步的问题,通常情况下我们有多种解法,可以使用Condition,Synchronize,semaphore等等,我们用可重入锁来解答这个问题。(美团实习)package com.test;import java.util.concurrent.locks.Condition;import java.util.concurre原创 2021-08-20 11:18:18 · 601 阅读 · 0 评论 -
MySQL逻辑架构以及调优篇
逻辑架构MySQL的进阶,深入底层,在介绍之前,先放出这张图,然后再逐一解释:MySQL的逻辑架构分为下面这几层:1.连接层最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcplip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。2.服务层第二层架构主要完成大多少的核心服务原创 2021-06-28 00:29:05 · 151 阅读 · 0 评论 -
Rand7()实现Rand10()
这道题选自LeetCode470题,启发自题解,这道题在阿里的实习中出现过,解法基本是数学概率论中的知识。当我们用random10实现random7的时候,我们根据概率论的知识知道random10会生成1-10,对于1-7的每个元素都是等概率的,所以,我们只需要判断生成的元素处于1-7区间,就能得到random7,反过来从一个random低实现一个random高,那就同样也是借助这种思路,我们可以借助random低模拟出一个random更高来实现random高。(rand7()-1) * 7 + r原创 2021-06-27 12:34:02 · 1134 阅读 · 0 评论 -
手写一个线程池
这是面试过程中被问到的一个有趣的问题(滴滴实习),现在的面试官不再循规蹈矩问些线程池的实现方式,核心参数,拒绝策略这些常规的问题,反倒是现在考察动手能力,了解你是否是背的八股,还是真实了解它的底层原理。下面由浅入深实现一下线程池,从一个基本符合面试官要求,到面试官满意的例子:其实线程池的实现就是一个生产者消费者模式,我们先来看怎么实现一个简单的生产者消费者模式(阻塞队列实现),再来扩展到一个线程池怎么实现的。额,考虑到有些面试要你完成阻塞队列的实现,所以我们打算直接从最原始的阻塞队列的实现开始,好了我原创 2021-06-09 14:52:42 · 322 阅读 · 7 评论 -
二分的思想在算法中体现
在引入思想之前,先做几个题目:875. 爱吃香蕉的珂珂class Solution { public int minEatingSpeed(int[] piles, int h) { int len = piles.length; if(len == 0) return 0; long left = 1; long right = (long)Math.pow(10,9); while(left < righ原创 2021-05-07 10:55:40 · 81 阅读 · 0 评论 -
操作系统复习指南
OS系列文章目录 第一章 待填写提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录OS系列文章目录前言一、中断1.中断的分类2.硬中断和软中断二、系统调用1.什么是系统调用三,进程1.什么是进程2. 进程的组织方式3 .进程的特征4. 进程的几种状态及其转换5.进程间的通信总结前言操作系统对于我们理解计算机的运行非常重要,无论是面试还是工作过程中的需要,掌握好操作系统的底层运行原理对于我们学习的提升有重大的帮助,接下来的几章节我将带大家系统的复习一遍操作系统。提示原创 2021-04-24 17:12:04 · 222 阅读 · 2 评论 -
归并排序(分治法)
归并排序,涉及到两个函数,一个函数merger()负责把两个有序的子序列合并成一个有序的子序列,另外一个函数tomany()是负责把子序列排序,是采用分治的思想排序。首先把子序列分成一个,都是有序的,两个通过递归调用merger(),也能使他有序,因为一个是有序的,merger()能使两个有序的,大小为1的子序列合并成一个大小为2的子序列,由此可见扩展成4,8,16个都能使之有序。代码如下:原创 2017-07-24 18:24:29 · 922 阅读 · 0 评论 -
折半查找的几个变形
class Solution { public int findMin(int[] nums) { int len = nums.length; if(len == 1) return nums[0]; int start = 0, end = len-1; if(nums[end] > nums[start]) return nums[0]; while(start < end){ .原创 2021-01-13 10:51:02 · 137 阅读 · 0 评论 -
总结几个字符串类的动态规划(最长公共子串,回文子串,子序列)
在阅读下面的题目之前,首先需要确定的是,求子序列还是子串,子串需要是连续的,子序列无需连续,比如 “Hello”,子串可以是 Hel, llo, lo 等,子序列可以是 Hlo, Heo.下面步入正题:516. 最长回文子序列解题思路:我们定义 dp[i][j] 表示从索引i到索引j最长的回文子序列,最后我们需要求的是dp[0][len]从0到len-1下标的最大回文串长度,显然当dp[i][i]为1,当只有一个字符串的时候,假设已知dp[i+1][j-1]的大小,我们需要确定更外层的大小,也原创 2021-01-08 20:40:48 · 257 阅读 · 0 评论 -
针对中位数求解的几道题
首选用堆,一般用两个堆来求解中位数。class MedianFinder { int count; PriorityQueue<Integer> max; PriorityQueue<Integer> min; /** initialize your data structure here. */ public MedianFinder() { count = 0; max = new Priori原创 2021-01-03 11:28:09 · 229 阅读 · 0 评论 -
快速排序 (随机选择pivot)
快速排序也是分而治之的思想,是所有的内排中最好的一种。#include<stdio.h>int quick(int a[],int start,int end);void sort(int a[],int start,int end);void main(){ int a[5]= {12,45,2,13,42}; for(int i=0; i<5; i++) p原创 2017-07-22 16:04:21 · 951 阅读 · 0 评论 -
堆排序/手写堆
堆排序: 1,开始建堆,已一个小根堆为例:(图片摘自别人,与下面的排序代码无关)构造好了堆之后,下面就是排序的过程:直接上代码了:#include<iostream>using namespace std;void sift(int a[],int m,int n);void sorts(int a[],int n);void swaps(int *sa,int *b);int main原创 2017-08-06 15:24:17 · 317 阅读 · 0 评论 -
单调栈解决维持相对位置不变最小/最大字典序问题
多次碰到这类维持相对位置不变,删除某些元素维持最小or最大字典序问题,这里记录一下:首先给出一个经典的例子:我们想要维持最小或者最大,无非是要保持相对有序的情况下,保持一个递增或者递减栈,其实就是一个单调栈的问题,上题中的移除K个元素使得最后的剩下的数字最小,题目是想告诉你维持一个单调递增栈。分析:对于1432219这种情况,第一个元素1,由于栈内没有其他元素,所以入栈,第二个元素4,栈内递增,不用管,第三个元素3,此时不是递增,需要把4出栈,再把3入栈,由于我们最多只能删除K个元素,所以当出栈元原创 2020-12-02 10:46:24 · 321 阅读 · 0 评论 -
分治法解决逆序对问题
直接暴力,O(N2)O(N^2)O(N2)时间复杂度,必然是超时的,hard 怎么可能让你这么轻松AC ????,楼主还是愿意试试:试了两种方法超时了,还是太笨了,于是不争气的看了题解????,之前没做过这种题型,可以理解,下次碰到这种可不能错了,这是基于分治法的一种应用,如果熟悉归并排序的,应该是没问题,不熟悉的话,可以跳到这里 归并排序,我们在合并的过程中进行计算,这里官方给了一个视频讲解,(顺便膜拜一下weiwei大佬????):原创 2020-12-01 17:05:14 · 846 阅读 · 1 评论 -
线段树 && 树状数组
基于数组写的线段树,建议配合使用 307. 区域和检索 - 数组可修改import java.util.Arrays;public class SegmentTree { int n; int[] tree; public SegmentTree(int[] nums){ n = nums.length; tree = new int[4*n]; } public void buildTree(int[] nums){原创 2020-11-29 23:04:19 · 119 阅读 · 0 评论 -
Interval(区间类问题)
这类问题其实是有一些固定的解题思路,可以节省很多时间,下面以一个简单的例子作为入门(传送门):先给出代码,最后我们再进行解释:class Solution { public int[][] merge(int[][] intervals) { // step 1: sort int len = intervals.length; if(len < 2) return intervals; Arrays.sort(interv原创 2020-11-23 23:10:14 · 1359 阅读 · 0 评论 -
LRU的两种实现方案
看到这个问题,可能拿到手就想用LinkedHashMap来几分钟就给实现了,确实也可以,但是现在很多面试要求你不用LinkedHashMap能不能实现这个问题,基于面试的这种要求,我开了这篇博客:(常规解法)基于 LinkedHashMap 实现:class LRUCache { Map<Integer,Integer> map; private int capacity; private int size = 0; public LRUCache(int原创 2020-11-18 17:51:22 · 375 阅读 · 0 评论 -
SQL常用的几个窗口函数
这里记录一下刷题常用或者面试经常问到的几个窗口函数:窗口函数的语法:函数 over (partition by 用于分组的列名 order by 用于排序的列名)For instance:select dense_rank() over (partition by classes order by Score desc) as 'Rank' from Scores;我们对每个班级按照成绩进行排名,我们可能会得到类似于下面这个结果:班级成绩Rank195119原创 2020-11-05 13:05:26 · 1322 阅读 · 0 评论 -
JDK动态代理
前言从接触jdk到现在已经是第四个年头,从大二开始正式搞Java开发,中间因为耽误了一年考研,没怎么学Java,后来又断断续续的学习Java,Python,到现在搞深度学习,自己是那种什么都知道一点儿,但是什么都不精通,这样确实很不好,所以现在想把精力都放在Java学习上,废话不多说,希望大家学习之路不要像我一样东一榔头,西一榔头,静下心来专心研究一个方向。很是惭愧,现在才开始学习动态代理,本来应该是本科阶段就应该掌握的东西。代理模式 和 装饰器模式区别这里引用自:链接 一段话代理模式,注重对对象原创 2020-10-28 14:16:35 · 98 阅读 · 0 评论 -
DFS+二分图
DFS + 二分突破看了大佬的二分+DFS模板之后,发现真是屡试不爽:水位上升的泳池中游泳,这篇文章真的很不错,之后,我自己做了几道差不多的题目,学以致用:这是一道猿辅导周赛题目(1631. 最小体力消耗路径)我记得当时做的时候,就止步于这道题目,当我再次能做出来的时候,真的很激动,很是享受这种征服的感觉。rows == heights.lengthcolumns == heights[i].length1 <= rows, columns <= 1001 <= heig原创 2020-10-27 21:33:49 · 284 阅读 · 0 评论 -
图的一些搜索问题
这题,定睛一看,就是拓扑排序,看着简单,但是怎么挑选合适的数据结构来表示图确实是问题:这里我们用了双List来表示一个临接矩阵。class Solution { List<List<Integer>> edges; int[] inch; // 入度 public boolean canFinish(int numCourses, int[][] prerequisites) { edges = new ArrayList<>.原创 2020-10-17 15:22:15 · 291 阅读 · 0 评论 -
单调栈与单调队列
1. 单调队列先说一下单调栈的用途,一般用来求下一个大数,为了解释这个,我给出下面几个例子:直达地址class Solution { public int[] nextLargerNodes(ListNode head) { Stack<Integer> stack = new Stack<>(); List<Integer> data = new ArrayList<>(); while(he原创 2020-10-12 23:07:53 · 92 阅读 · 0 评论 -
dp专题
对“dp[i-1][j-1] 表示替换操作,dp[i-1][j] 表示删除操作,dp[i][j-1] 表示插入操作。”的补充理解:以 word1 为 “horse”,word2 为 “ros”,且 dp[5][3] 为例,即要将 word1的前 5 个字符转换为 word2的前 3 个字符,也就是将 horse 转换为 ros,因此有:(1) dp[i-1][j-1],即先将 word1 的前 4 个字符 hors 转换为 word2 的前 2 个字符 ro,然后将第五个字符 word1[4](因为..原创 2020-10-12 14:19:31 · 159 阅读 · 0 评论 -
树形DP
DP变种记:第一次在POJ上提交题目,对Java开发者及其不友好~~,直接编译错误了。Anniversary partyDescriptionThere is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the superviso原创 2020-10-06 20:24:45 · 68 阅读 · 0 评论 -
设计模式笔记整合
工厂方法: 传送门原创 2020-10-04 17:29:23 · 86 阅读 · 0 评论 -
快速幂算法
快速幂公式:abmodca^b\quad mod\quad cabmodc推导在这里:推导过程int PowerMod(int a, int b, int c){ int ans = 1; a = a % c; while(b>0) { if(b % 2 = = 1) ans = (ans * a) % c; b = b/2; a = (a * a) % c; } return ans;原创 2020-10-03 13:39:57 · 126 阅读 · 0 评论 -
软件设计7大原则
关于依赖倒置原则,这里引用一个简单的例子来理解这个问题。 慕课笔记原创 2020-10-03 11:22:43 · 997 阅读 · 0 评论 -
背包问题(2)
首先来个热身的例子:这个一开始我以为就是个单纯的贪心问题,结果按照贪心的思路去做,果然wr了,提交错误。。。。。class Solution { public int findMaxForm(String[] strs, int m, int n) { Arrays.sort(strs, new Comparator<String>() { public int compare(String a, String b) {原创 2020-10-02 13:19:10 · 126 阅读 · 0 评论 -
0-1 背包问题
经典背包问题假设有n个物品,一个容量为C的背包,每个物品有相应的价值,怎么实现价值最大?用递归实现:int[][] memo = new int[n][n];int bestValue(int[] w, int[] v, int index, int c){ if(index < 0 || c <= 0) return 0; if(memo[index][c] != -1) return memo[index][c]; int res = bestValue(w,v,index-1原创 2020-09-24 17:31:35 · 90 阅读 · 0 评论 -
打家劫舍问题
参考:打家劫舍问题 leetcode题解打家劫舍(1)用递归先实现:自下而上实现(超时class Solution { int[] memory; public int rob(int[] nums) { if(nums.length == 0) return 0; memory = new int[nums.length]; return helper(nums,0); } public int helper(int[原创 2020-09-22 10:58:14 · 234 阅读 · 0 评论 -
从回溯到DP
回溯到动态规划dp的开始从一个典型的例子开始:300. 最长上升子序列首先试着用回溯法来解决这个问题:class Solution { int res = 0; public int lengthOfLIS(int[] nums) { if(nums.length == 0) return res; helper(nums, new ArrayList<>(),0); return res; } publ原创 2020-09-14 19:52:35 · 431 阅读 · 0 评论 -
递归专题
Train递归类问题目前和动态规划应该都是我的噩梦,简单点的还行,稍微复杂就不行了,有必要专门来对此训练先从一个lc上简单的开始,虽然题型定义为简单,不用递归确实简单,用了递归让我很是不理解:class Solution { public ListNode swapPairs(ListNode head) { if(head == null || head.next == null){ return head; } Li原创 2020-09-10 15:32:10 · 158 阅读 · 0 评论 -
回溯专题leetcode
这期刷leetcode上所有的回溯专题93. 复原IP地址这题先不考虑一些剪枝类问题,只是单纯考虑AC,我们设置的两个参数,一个index表示索引到哪个字符串下标了,另一个strs双端队列放入表示合法的字符串(0-255)class Solution { List<String> res = new ArrayList<>(); public List<String> restoreIpAddresses(String s) {原创 2020-09-08 17:37:00 · 253 阅读 · 1 评论 -
队列的算法相关专题
同样,这里也以一道题目为切入点这题看似和队列没啥关系,但是涉及到图的广度优先遍历,我们可以构造出一个关系图:拿6举例子,和2之间相差4,和5相差1,都是平方数,此图就是由相隔平方数构成。class Solution { public int numSquares(int n) { Queue<Pair> queue = new LinkedList<>(); queue.offer(new Pair(n,0)); if(n原创 2020-09-04 20:19:45 · 322 阅读 · 0 评论 -
算法面试中单链表专题
链表是算法面试中一个比较常考的内容,下面以面试中常见的算法题作为切入点:首先来道开胃菜:92. 反转链表解题思路: 这道题反转,我们可以考虑以头插法的方式来解决,这样一个好处是,我们对中间的链表进行反转之后,重新插入只需要考虑尾部,头部不用考虑了,举例来说:上面的 2->3->4,通过尾插法之后,1->4最后连接不用管了,而只需要关心2->5的连接。代码如下:class Solution { public ListNode reverseBetween(Li原创 2020-09-01 16:32:05 · 120 阅读 · 0 评论 -
AIO实现Echo
首先定义服务端先定义服务端的关闭,这个在多处函数中用得着:只要是实现了closeable接口的都可以调用private void close(Closeable closeable) throws IOException { if(closeable != null){ closeable.close(); }}然后是我们用到的主要的函数:public void start() throws IOException { tr原创 2020-05-24 18:27:24 · 335 阅读 · 0 评论 -
Java中文件复制的一个汇总
Java文件复制(包括NIO)我们首先定义一个拷贝接口:public interface FileCopyRunner { void copyFile(File source, File target) throws IOException;}最原始的复制方法(不涉及到缓存)FileCopyRunner noBufferStreamCopy = (source, target) -> { int r; InputStream fin原创 2020-05-18 21:24:28 · 203 阅读 · 0 评论 -
Java BIO多人聊天室
基于上篇NIO的多人聊天室,这篇将用BIO也实现一遍首先是服务端的设计:/** * @author Jing * @create 2020/5/17 */public class ChatServer { private int DEFAULT_PORT = 8888; private final String Quit = "quit"; private ServerSocket serverSocket; private Map<Integer,原创 2020-05-18 14:46:06 · 285 阅读 · 0 评论