![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法题
Steven_L_
这个作者很懒,什么都没留下…
展开
-
【算法】解压字符串(猿辅导笔试题)
猿辅导APP需要下发一些宣传文本给学生,工程师们使用了一种字符压缩算法,为简单起见,假设被压缩的字符全部为大写字母序列,A,B,C,D…Z,压缩规则如下:1.AAAB可以压缩为A3B (单字符压缩不加括号)2.ABABA可以压缩为(AB)2A (多字符串压缩才加括号)输入数据保证不会出现冗余括号,且表示重复的数字一定合法且大于1,即不会出现:1.(A)2B ------- (应为:A2B)2. ((AB))2C,-----(应为:(AB)2C )3. (A)B ----- (应为:AB原创 2020-07-29 12:06:16 · 1089 阅读 · 0 评论 -
【算法】找出个数过半的元素(投票算法)
要求从一个数组中找到个数超过半数的元素。解法将元素放入map中,value为其计数,然后检查个数过半元素。时间复杂度:O(n)、空间复杂度O(n);排序,然后找到中间索引位置的值,进行double check。以快排为例,时间复杂度:O(nlogn)、空间复杂度O(1);投票算法:从左向右遍历,初始count=0,表示没有候选cand,将下一个扫描到的元素赋值为候选并设置count=1,以后如果count!=0且元素等于候选,count++,否则count–。最后如果有候选,则可能为个数过半元.原创 2020-07-24 17:19:48 · 834 阅读 · 0 评论 -
【算法】快排优化
快排的平均时间复杂度为O(nlogn),但在最坏情况下为O(n^2),对应每次都不能有效partition的情况(即原数组已经有序)。对快排的改进思路:每次选取基准元素时,进行随机交换,确保基准元素的随机性对划分的元素个数已经很少时,进行插入排序提高效率,避免对小数据集的partition使用“三路快排”思想,即将原数组划分为:小于基准元素、等于基准元素和大于基准元素的三部分。Java代码实现 public void quickSort3(int[] array, int low, i原创 2020-07-18 09:55:38 · 599 阅读 · 0 评论 -
【算法】删除源文件中的注释(字节跳动面试题)
要求删除源文件中的注释,包括单行注释“//”以及多行注释“/* */”。本题是字节跳动三面面试题。本题解法是有限状态机。注意如果采用匹配算法,如正则会有bug,比如测试用例:/* //aaa */ bbb// ccc我们定义三个状态:普通NORMAL、单行注释SINGLE以及多行注释MULTI;并定义行为:单行注释开始标志SINGLE_START、多行注释开始标志MULTI_START、单行注释结束标志SINGLE_END、多行注释结束标志MULTI_END、无行为NONE。每次根据字符原创 2020-07-13 10:33:25 · 2096 阅读 · 3 评论 -
【算法】O(n)的topK算法(字节跳动面试题)
前言字节跳动二面面试题,开始想到维护小顶堆,面试官提示优化到O(n),考虑计数排序,但计数排序需要大量空间,本题最优解法为《算法导论》上的快速选择算法,记录一下。topK算法常见于排行榜等场景,常规的解法有:排序 O(nlogn)对整个数组进行了排序,显然我们只需要前K个,后面的N-K是无意义的排序,有优化空间。堆 O(nlogk)建小顶堆,并保持堆中元素个数为k个,遍历一次数组,每个数组中元素与堆顶元素比较,如果大于堆顶元素,则将堆顶元素移除,加入新元素。计数排序要求数组的数字有一定原创 2020-07-10 12:35:33 · 1389 阅读 · 1 评论 -
【算法】字符串匹配之KMP算法
对于字符串匹配,暴力法是对每个位置进行逐位匹配,只要有匹配失败的,就从待匹配串的下个位置开始从头匹配,这样的时间复杂度是O(MN)。KMP算法能解决这样效率低下匹配,其核心思想是保留已匹配的前缀和,避免重复匹配,时间复杂度是O(M+N)。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A原创 2020-07-03 16:56:55 · 2495 阅读 · 0 评论 -
【算法题】滑动窗口最大值
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 .原创 2020-06-27 09:49:32 · 1092 阅读 · 0 评论 -
【算法】全排列算法
算法题中常见给定任意一个组合,输出所有的排列 如leetcode:https://leetcode-cn.com/problems/permutation-i-lcci/无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。示例1:输入:S = “qwe”输出:[“qwe”, “qew”, “wq原创 2020-06-22 18:37:01 · 1086 阅读 · 0 评论 -
【算法题】股票买卖问题解法详解
本解法是股票问题的通用解法,在leetcode上对应以下题:买卖股票的最佳时机买卖股票的最佳时机 II买卖股票的最佳时机 III买卖股票的最佳时机 IV买卖股票的最佳时机含手续费最佳买卖股票时机含冷冻期下面来说通用解法: 这类问题有一个状态转移图:其中:0表示未持有股票,1表示持有股票。则对应于每一天,有持有和未持有两种情况。如果某一天持有股票,则可能是前一天就已持有股票或前一天未持有股票原创 2020-06-19 23:04:27 · 2239 阅读 · 1 评论 -
【算法归纳】二叉树遍历的非递归算法
二叉树遍历的常规算法是递归,通过一个栈可实现非递归算法,许多关于树的算法题都是这些非递归算法的变形,需要熟练掌握。特别注意后序遍历的特殊性,在回溯时需要判断右子树是否已经访问过。1、前序遍历public void pre(TreeNode node) { Stack<TreeNode> stack = new Stack<>(); TreeNode cur = node; while(cur!=null || !stack.isEmpty()) {原创 2020-05-17 15:49:15 · 1269 阅读 · 0 评论 -
【算法题】左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!分析循环左移可以视作3次字符串反转,分别是分界线两侧分别反转和全字符串的反转。如例子中,依次反转abc、XYZdef、整个字符串,即可得到XYZdefabc。代码public class Solut原创 2020-05-12 22:56:06 · 877 阅读 · 0 评论 -
【算法题】链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。分析要判断链表是否有环直接用快慢指针即可,但如何找到入口结点呢?画个草图分析一下:快慢指针在红色标记处相遇,则有如下等式成立:2(A+B)=A+2B+C得到:A=C那么此时用另一个指针从头结点开始,每次移动一步。最终,它们会在入口结点相遇。代码public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) {原创 2020-05-11 00:34:29 · 648 阅读 · 0 评论 -
【算法题】和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!输出描述输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序分析滑动窗口法,初始化low=1、high=2原创 2020-05-09 23:54:26 · 1219 阅读 · 0 评论 -
【算法题】设计LRU缓存
题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥已经存在,则变更其数据值;如果密钥不存在,则插入该组「密钥/数据值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶你是否可以在原创 2020-05-09 19:59:10 · 6580 阅读 · 3 评论 -
【算法题】两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)分析先遍历一次两个链表,找到较长的,让该链表指针先走delta步,较短链表从头开始走,最终两指针必然会在第一个公共结点相遇。代码public class Solution { public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { int len1=g原创 2020-05-09 00:29:35 · 2149 阅读 · 0 评论 -
【算法题】丑数
题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。分析丑数可以分解成2a+3b+5c的形式,则可通过改变2、3、5的系数,依次找到下一个丑数。代码public class Solution { public int GetUglyNumber_Solution(int index) { if(index<7) return ind原创 2020-05-09 00:02:23 · 924 阅读 · 0 评论 -
【算法题】数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。分析要解这题需要对异或操作有比较深的理解。依次将数组中所有元素进行异或得到a,即num1和num2的异或。然后取a中二进制为1的一个位置,找到原数组中所有该位为1的数字进行异或,得到了num1,接下来再将num1与a异或,得到num2。代码//num1,num2分别为长度为1的数组。...原创 2020-05-06 12:13:55 · 2694 阅读 · 0 评论 -
【算法题】二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析暴力求解法:根据父结点指针找到根结点,进行中序遍历找到下一个结点即可,时间复杂度O(n)。根据几种情况下的分析,时间复杂度可优化到O(L),L为该结点与后继结点在树中的实际距离。1)如果该结点有右孩子,则找到右孩子的最左叶子结点返回;2)...原创 2020-05-06 08:43:35 · 2155 阅读 · 0 评论 -
【算法题】对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。分析本题比较简单,思想是镜像比较,即左孩子结点与右孩子结点比较,右孩子结点与左孩子结点比较,直到遍历全部二叉树匹配,则返回true,否则返回false。将通过三种二叉树的遍历方式进行求解。代码1(递归)public class Solution { boole...原创 2020-05-05 23:17:28 · 1347 阅读 · 0 评论 -
【算法题】序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得...原创 2020-05-05 20:35:42 · 1567 阅读 · 0 评论 -
【算法题】数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。分析用一个大顶堆、一个小顶堆实现,其中大顶堆保存的是较小的元素,则堆顶是这些元素中的最大值;小顶堆保...原创 2020-05-05 19:00:42 · 2327 阅读 · 0 评论 -
【算法题】矩阵中的路径
题目描述分析利用回溯法,从矩阵任一点开始,向四周试探,若满足字符顺序,则走一步并继续试探,直到字符串搜索结束返回true。如果都不满足,则回溯继续搜索。由于不能重复走同一个格子,需要一个额外的布尔数组记录走过的路径,同时,在回溯时要将走过的当前格子标记清除。代码(已AC)public class Solution { public boolean hasPath(char[] m...原创 2020-05-04 17:13:51 · 2902 阅读 · 0 评论 -
【算法题】机器人的运动范围
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8= 19。请问该机器人能够达到多少个格子?分析典型的DFS题。初始化一个布尔型二...原创 2020-05-04 16:47:30 · 3167 阅读 · 1 评论 -
【算法题】剪绳子
题目描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。输入描述输入一个数n,意义见题面。(2 <= n <= 60)输...原创 2020-05-04 16:09:52 · 2594 阅读 · 0 评论