随笔分类 -  【9】算法基础

备战2019年第十届蓝桥杯大赛
摘要:题目:求最长重复子串长度(可重复或者可交叉),例如 str = "abcbcbcbc",则最长重复子串为 "bcbcbc",最长重复子串长度为6。 思路:这道题用暴力解法的话不太现实,就算能实现效率也比较低。那这里用到的就是后缀数组+高度数组就能解决问题,这里有个规律:任何的子串都是某一个后缀数组的 阅读全文
posted @ 2019-01-27 17:44 |旧市拾荒| 阅读(947) 评论(0) 推荐(0)
摘要:题目大意:求字符串的前缀是否为周期串,若是,打印出循环节的长度以及循环次数。 这道题考察的是KMP算法中next数组的应用,必须理解透next[]数组代表的含义才t能通过它解决这道题。思路是先构造出 next[] 数组,下标为 i,定义一个变量 t = i - next[i] 就是next数组下标和 阅读全文
posted @ 2019-01-27 00:51 |旧市拾荒| 阅读(191) 评论(0) 推荐(0)
摘要:注意:这道题的解法和最短摘要一样,都是采用尺取法解决问题,注意这儿题目要求恰好包含,也就是说这个hiho字符串必须包含2个'h'、1个'i'和1个'o'。一个不能多,一个也不能少。 结果: 尺取法的模型:根据区间的特征交替推进左右端点求解问题,其高效的原因在于避免了大量的无效枚举,其区间枚举都是根据 阅读全文
posted @ 2019-01-26 17:32 |旧市拾荒| 阅读(367) 评论(0) 推荐(0)
摘要:一、什么是后缀数组: 字符串后缀Suffix 指的是从字符串的某个位置开始到其末尾的字符串子串。后缀数组 Suffix Array(sa) 指的是将某个字符串的所有后缀按字典序排序之后得到的数组,不过数组中不直接保存所有的后缀子串,只要记录后缀的起始下标就好了。 比如下面在下面这张图中,sa[8] 阅读全文
posted @ 2019-01-26 01:08 |旧市拾荒| 阅读(1273) 评论(0) 推荐(1)
摘要:什么是KMP算法: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实 阅读全文
posted @ 2019-01-24 00:33 |旧市拾荒| 阅读(374) 评论(0) 推荐(1)
摘要:题目:假如要判断字符串A"ABA"是不是字符串B"ABABABA"的子串。 解法一:暴力破解法, 直接枚举所有的长度为3的子串,然后依次与A比较,这样就能得出匹配的位置。 这样的时间复杂度是O(M*N),M为B的长度,N为A的长度。 解法二:Rabin-Karp算法 思想:假设待匹配字符串的长度为N 阅读全文
posted @ 2019-01-23 20:19 |旧市拾荒| 阅读(1164) 评论(0) 推荐(0)
摘要:题目:Alibaba笔试题,给定一段产品的英文描述,包含M个英文单词,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法。String extractSummary(String description,String[] key words)目标是找出此产品描 阅读全文
posted @ 2019-01-22 22:58 |旧市拾荒| 阅读(794) 评论(0) 推荐(0)
摘要:题目一:移除字符串中连续出现的K个0。 代码: 题目二:回文字符串。 代码: 阅读全文
posted @ 2019-01-22 22:28 |旧市拾荒| 阅读(280) 评论(0) 推荐(0)
摘要:题目一:压缩字符串。实现一个算法,利用字符重复出现的次数,实现基本的字符串压缩功能。比如,测试样例"aabcccccaaa" 返回:"a2b1c5a3"。若压缩后的字符串没有变短,则返回原先的字符串。 代码: 题目二:判断两字符串的字符集是否相同。实现一个算法,判断两个字符串是否由相同的字符所组成, 阅读全文
posted @ 2019-01-22 16:06 |旧市拾荒| 阅读(307) 评论(0) 推荐(0)
摘要:题目一:实现一个算法,确定一个字符串的所有字符是否全都不同(有没有重复字符)。 代码: 题目二:请实现一个算法,翻转一个给定的字符串。 代码: 题目三:变形词问题。给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 代码: 题目四:替换字符串中的空格。请编写一个方 阅读全文
posted @ 2019-01-21 16:25 |旧市拾荒| 阅读(314) 评论(0) 推荐(1)
摘要:题目:给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。 思路: 代码: 结果: 阅读全文
posted @ 2019-01-20 17:15 |旧市拾荒| 阅读(507) 评论(0) 推荐(0)
摘要:题目: 给定一个数组arr,返回子数组的最大累加和。例如arr = {1,-2,3,5,-2,6,-1};所有的子数组中[3,5,-2,6]可以累加出最大的和12,所以返回12。 代码: 结果: 注意:上面的代码没有考虑数组全为负数的情况,如果数组全为负数的话,返回数组的最大值即可。 阅读全文
posted @ 2019-01-20 15:40 |旧市拾荒| 阅读(352) 评论(0) 推荐(2)
摘要:题目:给定一个N*N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度,例如: 思路:直接枚举,根据阶数递减扫描,每一阶都要遍历所有数组,根据每一个点扫描这个点向右向下向左向上途经的每一个数据能不能构成一个边框全是1的正方形。 代码: 结果: 优化:这个算法的时 阅读全文
posted @ 2019-01-19 23:18 |旧市拾荒| 阅读(799) 评论(0) 推荐(1)
摘要:基础题一:顺时针打印二维数组 代码: 结果: 基础题二:将0所在的行列清零 代码: 结果: 基础题三:Z形打印二维数组 代码: 结果: 阅读全文
posted @ 2019-01-19 16:27 |旧市拾荒| 阅读(242) 评论(0) 推荐(0)
摘要:题目:输入两个字符串str1和str2,请判断str1中所有字符是否都存在于str2中(大众点评笔试题)。 思路:一看这题目很容易想到暴力破解,不过这样的话效率是很低的,消耗的时间为s1.length*s2.length。那我们可以先对s2进行排序然后二分查找,这样的话时间复杂度就会降低到s1.le 阅读全文
posted @ 2019-01-19 10:30 |旧市拾荒| 阅读(187) 评论(0) 推荐(0)
摘要:题目:输入一个正整数数组,把数组里所有整数拼接起来排成一个数,打印出能拼接出的所有数字中最小的一个。如输入数组{3,32,321},则输出这三个数字能排成的最小数字为:321323 代码: 结果: 总结:这道题告诉我们要灵活使用JavaAPI,在竞赛或工作中直接调用即可,就不用在手写了。 阅读全文
posted @ 2019-01-19 10:13 |旧市拾荒| 阅读(398) 评论(0) 推荐(0)
摘要:题目:求海量数据(正整数)按逆序排列的前k个数(topK),因为数据量太大,不能全部存储在内存中,只能一个一个地从磁盘或者网络上读取数据,请设计一个高效的算法来解决这个问题。 第一行用户输入K,代表要求得topK 随后的N(不限制)行,每一行是一个整数代表用户输入的数据 直到用户输入-1代表输入终止 阅读全文
posted @ 2019-01-18 22:38 |旧市拾荒| 阅读(939) 评论(0) 推荐(0)
摘要:题目:给定一个无序数组长度arr,求出需要排序的最短子数组长度。如输入:arr={2,3,7,5,4,6},返回4,因为只有{7,5,4,6}需要排序。注意这儿题目是要求数组按照递增排序。 代码: 总结:拿到这种题目,需要仔细分析,然后发现规律,并且在分析的过程中要考虑各种测试用例,小数据、大数据、 阅读全文
posted @ 2019-01-18 17:04 |旧市拾荒| 阅读(287) 评论(0) 推荐(1)
摘要:题目:给定已排序数组,不重复打印arr中所有相加和为k的不降序二元组?扩展题:三元组呢?如输入arr = {-8,-4,-3,0,2,4,5,8,9,10},k=10,那么该输出(0,10) (2,8) 。 思路:一看这道题目就很容易想到循环暴力破解,时间复杂度为n²。这样肯定不太理想,所以得换解法 阅读全文
posted @ 2019-01-18 11:24 |旧市拾荒| 阅读(537) 评论(0) 推荐(1)
摘要:基于比较的排序: 基础排序: 冒泡排序:谁大谁上,每一轮都把最大的顶到天花板 效率太低——掌握swap。 选择排序:效率较低,但经常用它内部的循环方式来找最大值和最小值。 插入排序:虽然平均效率低,但是在序列基本有序时,它很快,所以也有其适用范围。 希尔排序(缩小增量排序):是插排的改良,对空间思维 阅读全文
posted @ 2019-01-18 10:23 |旧市拾荒| 阅读(362) 评论(0) 推荐(0)