
数据结构和算法及其应用
文章平均质量分 85
New俊
感谢你技术这么好还来关注我
展开
-
缓存算法LRU和LFU的简易实现
缓存问题:LRU和LFU原创 2022-02-07 21:16:29 · 554 阅读 · 0 评论 -
零钱交换及其延伸问题的讨论
有这样一个问题:给定不同面额的硬币 coins 和一个总金额 target,求出组成target金额的硬币序列。延伸出下列问题:1、零钱数组是否可以组成target表示的金额2、在1问题的基础上,凑出target表示金额所需要的最少零钱数量3、在2问题的基础上3.1、凑出target表示金额的所有零钱数量的组合3.2、凑出target表示金额的所有零钱数量的排列4、零钱数组每个数仅能用1次的基础上,是否还能凑出target表示金额5、在5的基础上,进行排列组合6、上述6个问题,零钱原创 2022-02-04 13:37:25 · 566 阅读 · 0 评论 -
跳表,红黑树,b+树,hashmap的区别?
跳表,红黑树,b+树,hashmap因为在其数据结构上的不同而体现出不同的性能,本文从下列角度来权衡各种结构的利弊,加深对各种结构的理解。1.为什么mysql使用b+树而不是红黑树或者hashmap?2.为什么redis使用跳表而不是红黑树或者hashmap?3.为什么重写equals以后还要重写hash1.为什么mysql使用b+树而不是红黑树或者hashmap?1.1、不使用红黑树是因为:1)在增删改查的过程中,时间复杂度为log2n,而b+是logmN,体现在内存和磁盘的IO上原创 2021-01-12 10:25:29 · 4375 阅读 · 4 评论 -
数据结构基础:堆栈队列
本文讲解的主要内容是堆栈队列,其中:堆主要讲解大小顶堆和堆的应用(查找第K大的元素)、优先队列栈主要讲解栈的实现(数组栈和链表栈)、双栈实现队列、最小栈、最小栈优化、单调栈、计算器队列主要讲解队列的实现(数组队列和链表队列)、队列实现栈说明:所有源码均可以在idea上调试。堆大小顶堆介绍:使用对排序对数组进行排序,根据排序规则分为大顶堆和小顶堆设计思路:初试化建堆,建完后,堆顶即最大/最小元素。交换堆顶和数组末尾元素,然后针对剩余的n-1个元素,对堆顶元素进行调整即可。重复2原创 2020-12-23 10:36:53 · 438 阅读 · 0 评论 -
往红黑树祖坟上刨根问底
一、题目描述将数组转化为红黑树(主要介绍add()、delete()、containsKey()方法)其中add函数共包含四部分:add()、insertFixup()、rotateRight()、rotateLeft()。delete函数包含:containsKey函数包含:详细源码:RedBlackTree二、解题思路add()\color{red}{add()}add()delete()\color{red}{delete()}delete()containsKe原创 2020-11-20 18:27:21 · 230 阅读 · 0 评论 -
六种链表反转方式
链表的反转有多少种方式原创 2020-11-13 09:08:10 · 679 阅读 · 0 评论 -
二叉树序列化和反序列化的两种方式
本文主要介绍二叉树的序列化和反序列化,内容为二叉树和数组的互相转化。二叉树的序列化按层遍历二叉树 输出数组S形遍历二叉树 输出数组先序遍历二叉树 输出数组中序遍历二叉树 输出数组后序遍历二叉树 输出数组二叉树的反序列化将按层次遍历的方式输入的数组 构造成一个二叉树将按先序遍历的方式输入的数组 构造成一个二叉树将按中序遍历的方式输入的数组 构造成一个二叉树将按后序遍历的方式输入的数组 构造成一个二叉树根据前序遍历序列和中序遍历序列,构建唯一一棵确定的二叉树根据后序遍原创 2020-11-09 09:24:51 · 4847 阅读 · 6 评论 -
0-1背包问题解法(动态规划、分支限界法(回溯法、剪枝法)、贪心算法)
本文主要讲解0-1背包问题的三种解法:动态规划分支限界法(回溯法、剪枝法)贪心算法什么是0-1背包问题:给定n个重量为w1,w2,w3…wn,其价值为v1,v2,v3…vn的物品和容量为C的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大正文开始动态规划主要思想主要代码注意事项分支限界法(回溯法、剪枝法)主要思想主要代码注意事项贪心算法主要思想主要代码注意事项...原创 2020-10-30 23:15:54 · 2003 阅读 · 0 评论 -
异或在笔试题中的超神表现
直接上题目:1、在一组数中,其他每个数都出现了两次,仅有一个数,仅出现一次,找出这个数。2、在一组数中,其他每个数都出现了两次,仅有两个数,仅出现一次,找出这两个数。3、在一组数中,其他每个数都出现了三次,仅有一个数,仅出现一次,找出这个数。你能做出来几道?解题思路:使用异或能极大程度的减小时间复杂度和空间复杂度。第一道题思路:源码:在这里插入代码片第二道题思路:源码:在这里插入代码片第三道题思路:源码:在这里插入代码片...原创 2020-08-31 22:33:25 · 1824 阅读 · 2 评论 -
可以进行浮点数运算的计算器
实现一个计算器,输入:运算表达式的字符串,输出:计算结果能够进行运算表达式的正确性校验能够计算小数原创 2020-07-31 11:38:47 · 3282 阅读 · 0 评论 -
背包问题解决公司零食采购(贪心+冒泡+动态)
问题描述公司需要采购零食,那么在有限金额的情况下,如何选择零食种类及每一种的数量,成为了每次都需要考虑的问题,那么有没有一种可以自动生成零食采购清单的程序,来解救公司选择困难症的采购小姐姐。输入:零食名称的数组,以及对应的单价,以及一个零食偏好度的数组,还有总额。输出:在照顾到零食偏好度的情况下,尽可能的花完预算,输出采购的零食种类、采购量及实际花费。源码:零食购买分配输入参数/*** @params foodName 零食名称* @params prices 零食价格* @.原创 2020-07-21 21:26:00 · 671 阅读 · 2 评论 -
最热笔试题:利用滑动窗口来解决字符串匹配
头条最热笔试题:利用滑动窗口来解决字符串匹配原创 2020-06-28 19:21:10 · 850 阅读 · 0 评论 -
13道字符串笔试题及答案,总有一道你面试会遇上
在这里,我会用x x道字符串题目来总结BATJHPM(字节、阿里、腾讯、京东、华为、拼多多、美团)可能会出现的字符串笔试题。1.最简单的是判断两个字符串是否相等,这个不难,jdk提供了equals方法,当然我们可以重写,特殊情况下重写时,一般会注意到“计时攻击”问题(一般应用于用户密码破解),不清楚的可以见我的博客:面试姊妹篇3:常用方法中的错误,第5条:计时攻击。2.稍微复杂点的,是判断一个字符串是否出现在另一个字符串内,这边我们提供五种算法来计算:分别是+3.接下来我们还要判断字符序列,是否存原创 2020-06-27 02:13:24 · 2787 阅读 · 0 评论 -
堆排序的两种写法
项目介绍本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。什么是堆排序数组满足树的结构父节点的两个子孙节点两种解法1、建堆整堆法2、直接整堆法正文开始1、建堆整堆法代码实现:HeapSort,测试用例:HeapSortTest设计思路:首先从数组的n/2开始,往回遍历至0,对于每原创 2020-06-23 00:21:01 · 606 阅读 · 0 评论 -
最长递增子序列的六种解法(gitbuh项目:AlgorithmPractice)
项目介绍本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。什么是最长递增子序列在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。最长递增子序列中的元素在原序列中不一定是连续的。五种解法1、暴力法2、动态规划法3、分治法4、字符串对比法5、分原创 2020-06-08 00:34:25 · 1812 阅读 · 0 评论 -
大整数乘法其实很简单(Java)
大整数相乘和相除的Java实现目的及介绍使用Java语言实现大整数相乘和相除设计思路本周六有空来完成具体步骤排坑细节原创 2020-05-14 23:29:44 · 1042 阅读 · 0 评论 -
开源数据结构和算法实践(开源项目:AlgorithmPractice)
通过动手实践了解数据结构和算法的底层原理;记录面试中遇到的面试题,并从多个角度进行分析;建立知识结构体系,方便查找;欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。......原创 2020-02-22 17:06:58 · 2824 阅读 · 0 评论 -
阿拉伯数字转人民币大写(gitbuh项目:AlgorithmPractice)
项目介绍本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。一、题目描述中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零...原创 2020-02-26 13:15:43 · 501 阅读 · 0 评论 -
Redis底层数据结构:跳表(SkipList)
项目介绍本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。一、题目描述跳表是什么:跳表是一种可以进行对半查找的链表,其通过在源链表上插入标记指针,再将标记指针也串成链表,这样通过查找标记指针达到快速...原创 2020-02-25 21:04:57 · 570 阅读 · 0 评论 -
五大经典字符串匹配算法的Java代码实现
项目介绍本项目通过分解各大厂的常见笔面试题,追本溯源至数据结构和算法的底层实现原理,知其然知其所以然;建立知识结构体系,方便查找,欢迎更多志同道合的朋友加入项目AlgorithmPractice,(欢迎提issue和pull request)。字符串匹配算法:1、BF(Brute-Force)算法2、BM(Boyer-Moore)算法3、RK(Rabin-Karp)算法4、KM...原创 2020-02-22 18:44:20 · 767 阅读 · 0 评论 -
十大经典内部排序算法的设计思路及应用
Introduction本项目旨在不断总结和实现面试和实际场景中的数据结构和算法问题,项目仍然在不断完善中,欢迎您的加入。notice:您可以首先通过我的思维导图了解每部分大致内容,然后根据思维导图中的链接跳转到我的博客,查看具体笔记内容,最后通过博客前端链接访问我的github,查看具体代码实现。special:ds means Data Structure, alg me...原创 2019-10-26 23:48:23 · 983 阅读 · 3 评论 -
常见动态规划的解题思路及Java实现
1.牛刀小试这部分内容选取了几道比较简单的动态规划题目,来逐步了解什么是动态规划。青蛙跳台阶最大子段和最长公共子序列回文应用(Palindrome)判断字符串是否属于回文添加一个字符构造回文删除一些字符构造回文查找给定字符串中最长的连续回文子串暴力法中心扩散法Manacher 算法2.抛砖引玉这部分内容只给出了基础的解,如果有更优化的解法,请在下方留言。...原创 2019-11-15 11:53:28 · 1069 阅读 · 0 评论 -
归并、桶排、基数、计数、希尔排序的具体Java实现
本部分内容包括:归并排序、桶排序、基数排序、计数排序代码实现:见我的github:排序(归并、桶排、基数排序、计数排序)一、归并排序设计思路1、数组分成两段,每段去排序2、排序时判断这两段是否越界,越界停止返回3、实行归并注意事项:灌装数组的时候,需要注意temp数组的起始位置。二、桶排序设计...原创 2019-06-26 09:22:16 · 420 阅读 · 0 评论 -
将String类型的IP地址转化成int
一、题目描述 1、将string类型的IP地址转化成int。 2、将int类型数转化成string类型的IP地址。二、代码实现见我的github:TransIPtoInt三、解题思路:首先是通过正则表达式对输入的string类型的IP地址进行判断,分割字符串进行累加(见注意事项),输出。1)正则表达式对输入的string类...原创 2019-07-08 15:29:24 · 2269 阅读 · 0 评论 -
子树判断(更新版本)
一、问题描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)。优化之前的解题思路:1)如果当前结点相同,则通过compare函数进行对比子树是否一样; 2)compare函数通过遍历对两个树进行相似判断。之前的博客:子树判断。但是存在一个问题:时间复杂度过高。根据评论建议,优...原创 2019-07-08 15:45:24 · 671 阅读 · 0 评论 -
KMP字符串匹配算法的Java实践
一、问题描述:设计并实现KMP算法。二、代码实现:见我的github:KMP三、解题思路:对于源串和匹配串,首先针对匹配串构造一个next前缀数组,用于记录最大公共前缀,然后使用这个前缀数组,去简化源串和匹配串的匹配方式。3.1、针对匹配串构造一个next前缀数组3.2、使用这个前缀数组,去简化源串和匹配串的匹配方式四、参考博客:字符串匹配(KMP)算法及Java实...原创 2019-07-08 16:56:01 · 212 阅读 · 0 评论 -
快速排序及插排优化的Java实现细节
本部分内容包括:单向快排、双向快排、快排改进(插排改)代码实现:见我的github:快排及其优化单向快排设计思路1.同时设两个指针,一个指针代表中间定位mid,另一个指针i从左到右寻找比标杆小的元素(隐藏在for循环中),2.当i找到比标杆元素小的,发生交换,3.最后一个比对元素跟标杆元素交换 ...原创 2019-07-03 16:57:23 · 368 阅读 · 0 评论 -
数独的Java实现
一、题目描述数独的Java实现。二、代码实现见我的github:Sudoku。三、解题思路 见代码及参考博客。 四、参考博客:...原创 2019-07-29 21:55:48 · 1151 阅读 · 0 评论 -
Math—水仙花数和吸血鬼数字的实现
一、题目描述水仙花数和吸血鬼数字的实现。 水仙花数介绍 吸血鬼数字介绍二、代码实现见我的github:Narcissistic(水仙花数) 、Vampire(吸血鬼数字)。三、解题思路参考博文:吸血鬼数。1、吸血鬼数的公式:2、这两道题最值得深究的地方在于:如果在最快时间内对比两组数相似(比如:“1231”和“3...原创 2019-08-02 10:26:45 · 205 阅读 · 0 评论 -
Sunday字符串匹配的Java代码实践
一、题目描述是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配。其效率在匹配随机的字符串时不仅比其它匹配算法更快,而且Sunday 算法的实现比KMP、BM 的实现容易很多!Sunday 算法与KMP 算法一样是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位字符的下一位字符。二、代码实现见我的github:Sund...原创 2019-08-26 21:19:00 · 225 阅读 · 0 评论