手撕代码
pcwl1206
这个作者很懒,什么都没留下…
展开
-
【搞定算法】找出数组中只出现一次的那个数,其他都出现两次【字节跳动面试题】
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。题目:找出数组中只出现一次的那个数,其他都出现两次。要求:时间复杂度O(N)、空间复杂度O(1)这道题因为要求了空间复杂度为 O(1),因此无法使用 map 的形式记录出现的次数来解题。分析:任何一个数字异或自己都等于 ...原创 2019-08-17 12:20:44 · 1205 阅读 · 0 评论 -
【搞定算法】最长的可整合子数组的长度
题目:最长的可整合子数组的长度。给定一个整型数组 arr,请返回其中最大可整合子数组的长度。例如:[5,5,3,2,6,4,3] 的最大可整合子数组为[5,3,2,6,4],所以返回 5。先给出可整合数组的定义:如果一个数组在排序之后,每相邻两个数差的绝对值都为 1,则该数组为可整合数组。例如:[5,3,4,6,2] 排序之后为 [2,3,4,5,6],符合每相邻两个数差的绝对值都为 1,所...原创 2019-07-25 14:41:51 · 1126 阅读 · 0 评论 -
【搞定算法】找出数组中出现次数大于数组长度一半和 N/K 的数
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验。目 录:1、找出数组中出现次数大于数组长度一半的数2、找出数组中出现次数大于数组长度 N/K 的数1、找出数组中出现次数大于数组长度一半的数一个数组中出现次数大于数组长度一般的数显然最多只有一个。题目:在数组中找到出现次数大于数组长度一半的数。...原创 2019-07-25 14:18:55 · 4982 阅读 · 7 评论 -
【搞定算法】字符串的翻转和旋转及其应用
目 录:一、字符串的翻转1、StringBuilder 实现2、双指针实现3、字符串翻转应用二、字符串的旋转1、三步翻转实现旋转【重点】2、String 的 substring 方法实现面试和笔试中我们也经常遇到字符串相关的翻转和旋转的题目。本文就对字符串的翻转和旋转做个简单的用法总结。一、字符串的翻转1、StringBuilder 实现可以直接利用 S...原创 2019-07-21 16:02:42 · 725 阅读 · 1 评论 -
【左神算法】一种接收消息并按顺序打印的结构设计
题目:一种消息接收并打印的结构设计:已知一个消息流会不断地吐出整数 1 ~ N,但不一定按照顺序吐出。如果上次打印的数为i,那么当 i + 1 出现时,请打印 i + 1 及其之后接收过的并且连续的所有数,直到 1 ~ N 全部接收并打印完,请设计这种接收并打印的结构。例如:消息流吐出 2,一种结构接收而不打印 2,因为 1 还没出现;消息流吐出 1,一种结构接收 1,并且打印:1,2。...原创 2019-07-24 12:27:43 · 693 阅读 · 0 评论 -
【左神算法】给定一个数字组成的字符串,返回有多少种合法的 IPV4 组合
题目:给定一个数字组成的字符串 str,返回有多少种合法的 IPV4组合。举例:str = “245111”,只有一种合法 IPV4组合:245.1.1.1,所以返回 1str = “11111”,所有合法的 IPV4组合为:1.1.1.111.1.11.11.11.1.111.1.1.1所以返回 4str = “100111”,所有合法的 IPV4组合为:100...原创 2019-07-24 11:47:40 · 1860 阅读 · 3 评论 -
【LeetCode】第25题:K 个一组翻转链表(字节跳动面试题)
LeetCode 链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/题目:给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。示例 :给定这个链表:1->2->3->4-...原创 2019-07-17 10:40:17 · 1428 阅读 · 0 评论 -
【LeetCode】第697题:数组的度(字节跳动面试题)
题目:给定一个非空且只包含非负数的整数数组nums, 数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是找到与nums拥有相同大小的度的最短连续子数组,返回其长度。示例 1:输入: [1, 2, 2, 3, 1]输出: 2解释:输入数组的度是2,因为元素1和2的出现频数最大,均为2.连续子数组里面拥有相同度的有如下所示:[1, 2, 2, 3, 1], [1, ...原创 2019-07-16 17:25:56 · 1440 阅读 · 0 评论 -
【搞定算法】BFPRT 算法、快排解决第 k 大数问题
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验。目 录:方法1:暴力解法方法2:快排实现【笔试版+面试版】方法3:BFPRT 算法实现【面试优化版】问题:求一个数组中的第 k 小 / 大的数。说明:这道题求解不难,主要的目的是为了引出 快排算法的应用(partiotion)和 BFPRT 算法...原创 2019-07-07 15:56:46 · 1760 阅读 · 1 评论 -
【搞定算法】需要排序的最短子数组长度
题目:给定一个无序数组 arr,求出需要排序的最短子数组长度。例如:arr = [1,5,3,4,2,6,7] 返回 4,因为只有 [5,3,4,2] 需要排序。要求:时间复杂度 O(N)、额外空间复杂度O(1)。假设数组为 [a b c d e f g h i j k l m n],如果 abc 是有序的,mn是 有序的,至于中间的 defghijkl 是无序的,我们可以得知,如果...原创 2019-07-25 15:16:19 · 1324 阅读 · 0 评论 -
【搞定算法】单调栈问题:直方图中的最大矩形面积、求最大子矩阵的大小、可见山峰问题
目 录:1、单调栈结构1.1、单调栈结构的实现:无重复元素1.2、单调栈结构的实现:有重复元素2、单调栈结构的应用2.1、直方图中的最大矩形面积2.2、求最大子矩阵的大小2.3、可见山峰问题本文主要用于讲解一种在面试笔试中经常使用到的一种算法结构:单调栈结构。1、单调栈结构单调栈结构:给一个数组,求任何位置左边和右边离它最近的比它大/小的数。要求:栈...原创 2019-07-22 15:57:29 · 2820 阅读 · 1 评论 -
【搞定算法】子数组最大累乘积
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。题目:给定一个 double 类型的数组 arr,其中的元素可正、可负、可 0,返回子数组累乘的最大乘积。例如:arr = [-2.5,4,0,3,0.5,8,-1],子数组 [3,0.5,8] 累乘可以获得最大的乘积 12,所以...原创 2019-07-26 11:03:05 · 733 阅读 · 1 评论 -
【搞定算法】判断一个字符串是否是一个合法的 IPV4【美团面试题】
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。这题并不难,但是却是很好的手撕代码题。需要注意的是字符串分割的一个细节:1、如果用 “.” 作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用 String.split(".");2、...原创 2019-08-15 01:02:40 · 1731 阅读 · 0 评论 -
【搞定算法】字符串的最长公共子串和最长公共子序列
目 录:1、求两个字符串的最长公共子串2、求两个字符串的最长公共子序列动态规划实现 求两个字符串的最长公共子序列的长度1、求两个字符串的最长公共子串要求:求两个字符串的最长公共子串,如:“abcdefg” 和 “adefgwgeweg” 的最长公共子串为 “defg”(子串必须是连续的)。 暴力解法【O(N^2)】 1、选出两个字符串中长度较短的那个字符串;...原创 2019-08-01 20:44:49 · 1002 阅读 · 0 评论 -
【LeetCode】第538题:把二叉搜索树转换为累加树(百度面试题)
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。LeetCode 链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/submissions/题目:给定一个二叉搜索树(Binary Search Tree),...原创 2019-08-01 18:49:02 · 452 阅读 · 0 评论 -
【搞定算法】Morris 遍历二叉树:前序、中序、后序
目 录:1、Morris 遍历的基本概念2、Morris 的前序遍历3、Morris 的中序遍历4、Morris 的后序遍历其实之前的文章里已经记录了二叉树的递归/非递归遍历代码实现。但是由于 Morris 遍历可以实现最优的遍历方式,这无疑是在面试时遇到此问题非常加分的回答。1、Morris 遍历的基本概念Morris 遍历:时间复杂度 O(N)、额外空间复杂度 ...原创 2019-07-23 11:50:08 · 833 阅读 · 1 评论 -
【搞定算法】常见算法题分类总览
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java 一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。完善中......由于本人平时刷题比较零散,有时候找起来不是很方便,所以统一将题目记录于此。主要的题目来源自:剑指 Offer、LeetCode、左神算法、面试、笔试、面经等等。下面按照分类记录:说明(个人见解):一、标注说明...原创 2019-07-26 15:24:05 · 25391 阅读 · 4 评论 -
【搞定算法】机器人走路问题
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。给定四个参数N、P、M、K。表示:N : 一共有1~N个位置P : 一共有P步要走M : 机器人初始停留在M位置上K : 机器人想要去的位置是K题目:已知,如果机器人来到 1 位置,那么下一步一定会走到 2 位置。如果机器人来到 ...原创 2019-07-26 14:40:10 · 1965 阅读 · 1 评论 -
【搞定算法】哈希表增加 setAll 功能
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。题目:哈希表常见的三个操作是 put、get 和 containsKey,而且这三个操作的时间复杂度为 O(1)。现在想加一个 setAll 功能,就是把所有记录的 value 都设成统一的值。请设计并实现这种有 setAll 功能的哈希...原创 2019-07-26 11:42:43 · 919 阅读 · 0 评论 -
【搞定算法】数组的奇偶位置问题
博主秋招提前批已拿百度、字节跳动、拼多多、顺丰等公司的offer,可加微信:pcwl_Java一起交流秋招面试经验,可获得博主的秋招简历和复习笔记。题目:给定一个整型数组,请在原地调整这个数组,保证要么偶数位置上都是偶数,或者奇数位置上都是奇数。要求:时间复杂度 O(N),额外空间复杂度 O(1)。这个题目需要注意的是:偶数在偶数的位置、奇数在奇数的位置,这两个条件满足其一...原创 2019-07-26 11:18:49 · 1578 阅读 · 2 评论 -
【搞定算法】滑动窗口问题:窗口内最大值、最小值的更新结构
目 录:1、滑动窗口2、滑动窗口的应用2.1、生成窗口最大值数组 2.2、求一个数组中最大值减去最小值小于或等于 num 的子数组数量(要求O(N))1、滑动窗口生成窗口的最大值或者最小值数组,时间复杂度:O(N)。可阅读:https://www.cnblogs.com/haozhengfei/p/a14049ec0869a8125a69f3af37471c77.htm...原创 2019-07-18 15:34:19 · 3568 阅读 · 0 评论 -
【LeetCode】第513题:找树左下角的值
LeetCode 链接:https://leetcode-cn.com/problems/find-bottom-left-tree-value/题目:给定一个二叉树,在树的最后一行找到最左边的值。分析:层次遍历二叉树,并在遍历时记录下一层的个数和当前的层的个数,当当前层的数量为 0 时,如果下一层的节点数量大于0,则更新 val 的值为队列中队首的值。遍历结束时,返回的 val 即为...原创 2019-07-11 17:43:55 · 459 阅读 · 0 评论 -
【LeetCode】第698题:将一个整数数组划分为K个相等的子集问题(字节跳动面试题)
最近看面经,有人在字节跳动的面试中,手写这道题,但是发现是 LeetCode 上的原题,所以记录下来。题目:给定一个整数数组nums和一个正整数k,找出是否有可能把这个数组分成k个非空子集,其总和都相等。示例 1:输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4输出: True说明: 有可能将其分成 4 个子集(5),(1,4),(2,3...原创 2019-07-08 10:56:32 · 8019 阅读 · 4 评论 -
【搞定算法】归并排序及其解决逆序对数、小和问题
归并排序也是分治法一个很好的应用,先递归到最底层,然后从下往上每次两个序列进行归并合起来,是一个由上往下分开,再由下往上合并的过程。而对于每一次合并操作,对于每一次 merge 的操作过程如下:1、准备一个额外的数组(help),使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;2、设定两个指针,最初位置分别为两个已经排序序列的起始位置;3、比较两个指针所指向的元素,选择...原创 2019-07-07 18:34:30 · 2850 阅读 · 2 评论 -
【手撕代码】背包问题:数组中任意数累加得到目标值(递归+动态规划)
问题:给你一个数组 arr,和一个整数 aim。如果可以任意选择 arr 中的数字,能不能累加得到 aim,返回 true 或者 false。一、递归版本【分析】:每个位置 i 有 要和不要 两种选择;叶节点会看自己这里的结果是不是 aim,从而向父结点返回 true 或 false,父结点比较子节点的结果,有一个为 true 就一直返回 true,否则返回 false。分析...原创 2019-04-23 17:17:47 · 2399 阅读 · 6 评论 -
【手撕代码】矩阵最小路径问题(递归+动态规划)
题目:给你一个二维数组,二维数组中的每个数都是正数,要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累加起来。返回最小的路径和。一、递归版本如果矩阵为 n x n,那么时间复杂度为:O()。递归版本虽然简单,但是时间复杂度过高,显然是不行的。通过分析发现,在递归过程中,会有很多重复的计算,如下图所示:在计算(1,0)位置的右元素和计算(0,1)位置的下元素时,...原创 2019-04-23 17:03:39 · 1328 阅读 · 1 评论 -
【手撕代码】单例模式
面试过程中,经常被遇到手写单例模式的代码,本文就常用的几种单例模式的写法进行总结。单例模式,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去 new,因为构造器是被 private 修饰的,一般通过 getInstance() 的方法来获取它们的实例。一、懒汉式用到时再去创建public class Singleton { private static Sin...原创 2019-04-26 20:13:10 · 1113 阅读 · 0 评论 -
【手撕代码】二叉树的前序、中序、后序、层级遍历
目 录:一、递归实现1、前序遍历2、中序遍历3、后序遍历二、非递归实现1、层级遍历2、前序遍历3、后序遍历4、中序遍历在面试中常常会问到二叉树的遍历形式:前序、中序、后序以及层级遍历。一般情况下,不会让你手写递归版本,因为确实太简单了,所以,我们需要熟练的掌握非递归版版本。一、递归实现1、前序遍历public class PreOrderWi...原创 2019-04-21 18:49:25 · 1449 阅读 · 0 评论 -
【手撕代码】二分查找:递归和非递归实现
本文主要讲述面试现场常遇见的手撕代码题:二分查找。虽然代码很好理解也很简单,但是感觉只有多练,多理解才能真的掌握。千万不要眼高手低,稳扎稳打才是王道。一、非递归版本public class BinarySearch { /** * 非递归实现 * @param array : 有序数组 * @param key :需要查找的数 * @re...原创 2019-04-21 14:52:21 · 1144 阅读 · 0 评论 -
【手撕代码】多个线程交替打印
目 录:方法一:锁实现【推荐】方法二:信号量 semaphore 实现【推荐】方法三:wait / notify 实现方法四:使用 Lock / Condition 实现面试的过程中,多个线程交替打印是经常被要求手写的。借用本文列出几种常用的解题方法。方法一:锁实现【推荐】times:保证每个线程的打印次数;state:保证每个线程之间的交替打印;lock:...原创 2019-04-21 11:35:53 · 1150 阅读 · 2 评论 -
【LeetCode】第560题:和为K的子数组
LeetCode 链接:https://leetcode-cn.com/problems/subarray-sum-equals-k/comments/题目:给定一个整数数组和一个整数k,你需要找到该数组中和为k的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明 :数组的长...原创 2019-07-09 15:31:16 · 2187 阅读 · 0 评论 -
【leetCode】第581题:最短无序连续子数组
LeetCode 链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/题目:给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。你找到的子数组应是最短的,请输出它的长度。示例 1:输入: [2, 6, 4, 8, 10, 9, 15]...原创 2019-07-09 16:48:54 · 454 阅读 · 0 评论 -
【LeetCode】第617题:合并二叉树
LeetCode 链接:https://leetcode-cn.com/problems/merge-two-binary-trees/comments/题目:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的...原创 2019-07-09 19:33:36 · 311 阅读 · 0 评论 -
【搞定算法】最长回文子串问题
该题目是 LeetCode 上的第五题:最长回文子串。题目:给定一个字符串s,找到s中最长的回文子串。你可以假设s的最大长度为 1000。本文给出该题目的三种解法:暴力解法、动态规划、Manacher 算法。暴力解法无法通过运行时间、Manacher 算法有点复杂,所以在真正笔试的时候,我会选择动态规划。但是要是在面试中遇到这道题,可以采用 Manacher 算法进行优化。...原创 2019-07-06 20:26:08 · 237 阅读 · 0 评论 -
【手撕代码】大数问题:大数相加和大数相乘问题 + Karatsuba 算法
目 录:1、大数相加2、大数相乘3、Karatsuba 算法大数问题,简而言之就是不可以使用 int 类型直接进行加减乘除的操作,需要将其转换为字符串后再进行操作。1、大数相加分析:将两个数字字符串转换成相同长度,短的数字高位补 0,主要的操作在于两个字符串对应位置相加后得到的结果是否需要进位的问题,最后还需要剔除结果数组中高位为 0 的数。public class...原创 2019-07-11 16:30:20 · 925 阅读 · 1 评论 -
【搞定算法】KMP 算法
目 录:1、问题描述2、next 数组3、代码实现4、KMP 的应用4.1、子树问题4.2、加最短字符问题前面讲过字符串匹配的其他几种算法:字符串匹配算法之 BF、RK、BM。本文用来讲解 KMP 算法及其应用,KMP 算法时间复杂度为:O(N + M),空间复杂度为:O(M)。1、问题描述给定两个字符串 O 和 f,长度分别为 n 和 m,判断 f 是否...原创 2019-07-06 15:57:45 · 510 阅读 · 0 评论 -
【手撕代码】手写一个简单的HashMap
最近看面经发现很多人都遇到手写 HashMap 的场景。我们都知道 JDK1.7 和 JDK1.8 中的 HashMap 实现差别还是比较大的,主要是JDK1.8中的 HashMap 引入了红黑树。那么面试过程中,应该不会让你手写红黑树的(我觉得),所以只需要掌握一个简单的 put、get、resize 方法即可。本文先写了 put 和 get 方法,其他方法后续再完善。1、先新建 16...原创 2019-07-05 00:54:20 · 3767 阅读 · 4 评论 -
【搞定算法】蓄水池算法
1、问题描述分析采样问题经常会被遇到,比如:1、从 100000 份调查报告中抽取 1000 份进行统计;2、从一本很厚的电话簿中抽取 1000 人进行姓氏统计;3、从 Google 搜索 "Ken Thompson",从中抽取 100 个结果查看哪些是今年的。既然说到采样问题,最重要的就是做到公平,也就是保证每个元素被采样到的概率是相同的。所以可以想到要想实现这样的算法,就需...转载 2019-07-04 15:55:05 · 2930 阅读 · 1 评论 -
【LeetCode】第1题:两数之和 + 第15题三数之和
目 录:1、两数之和2、三数之和LeetCode 链接:第1题:https://leetcode-cn.com/problems/two-sum/第15题:https://leetcode-cn.com/problems/3sum/1、两数之和暴力解:两次 for 循环,时间复杂度为:O(N)。两遍哈希表:为了对运行时间复杂度进行优化,我们需要一种更有效...转载 2019-07-10 00:17:32 · 632 阅读 · 0 评论 -
【LeetCode】第124题:二叉树的最大路径和
LeetCode 链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/本题可以对比左神算法中的:二叉树中的最远距离,只不过最远距离中没有考虑权重的问题,本题需要考虑每个节点的权重问题,还是有所区别的。题目:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该...原创 2019-07-09 21:25:05 · 1252 阅读 · 0 评论