
数据结构算法s
s
ReflectMirroring
希望你的努力配得上你的野心
展开
-
慌了,面试官问了我红黑树,菜虫来啃红黑树了
TreeMap首先给个网站,自己手动增加和删除红黑树节点网站BST说红黑树先从BST二叉查找树进行说起二叉树:每个子节点只有两个节点的树二叉查找树(二叉搜索树): 就是一颗二叉树,他的左节点比父节点要小, 右节点比父节点要大。他的高度决定的查找效率。BST操作查找(红黑树通用):查找每个节点我们从根节点开始查找 查找值比当前值大,则搜索右子树 查找值等于当前值,停止查找,返回当前节点 查找值比当前值小,则搜索左子树插入:要插入节点,必须先找到插入节点位置。依然是从根节点原创 2021-04-15 20:59:59 · 601 阅读 · 0 评论 -
腾讯面试题:假期
题目时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。输入描述:第一行一个整数 表示放假天数第二行 n 个数 每个数为0或1,第 i 个数表示公司在第 i 天是否原创 2021-04-04 19:24:51 · 253 阅读 · 0 评论 -
腾讯笔试题:逛街
题目时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。小Q从第一栋一直走到了最后一栋,小Q从来都没有见到这么多的楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住) 输入例子1:[5,3,8,3,2,5]输出例子1:[3,3,5,4,4,4]例子说明1:当小Q处于位置3时,他可以向前看到位原创 2021-04-04 17:56:58 · 513 阅读 · 0 评论 -
腾讯笔试题:压缩算法
题目时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 256M,其他语言512M小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么? 示例1输入HG[3|B[2|CA]]F输出原创 2021-04-04 14:45:53 · 411 阅读 · 0 评论 -
程序员必须会的基本算法1-动态规划算法的补充(矩阵连乘问题,最长公共子序列问题,最优二叉搜索树,电路布线,0-1背包问题)
特征动态规划和分治算法类似,基本思想都是将待求的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解和分治算法不同的是,动态规划求解的问题经过分解得到的子问题往往不是相互独立的,如果用分治算法解这类问题,则分解得到的子问题的数量太多,以至于最后解决原问题需要消耗指数的时间动态规划用一个表来记录所有已经解决的子问题的答案,下次需要就直接拿来用就行通常动态规划有这样的步骤:1.找出最优解的性质,刻画它的结构特征2.递归定义最优值3.以自底向上的方式计算出最优值4.根据最优原创 2020-11-16 21:26:58 · 699 阅读 · 0 评论 -
广度优先BFS与深度优先DFS的区别
BFS广度优先搜索算法(Breadth-First-Search,缩写为 BFS)在IT生活圈人称它的搜索过程类似水面丢进一块石头激起层层涟漪是一种利用队列实现的搜索算法,因为BFS在搜索过程中需要保存搜索过的状态,而且一般情况需要一个队列来记录,队列的数据结构还可以按照下标字典序列最小之类的排序要求规定进入的队列的顺序按照上面的形象比如,BFS在搜索的时候就是先将它身边可以遍历的节点都遍历进入队列中然后再从身边的节点里面再遍历所有的身边的节点的身边的节点这样子就像从一点向四周扩散,最后原创 2020-10-04 16:05:31 · 344 阅读 · 0 评论 -
程序员必须会的基本算法8-Dijkstra算法(迪杰斯特拉算法)
Dijkstra算法迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个结点到其他结点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。问题场景有7个节点(A,B,C,D,E,F,G),从G点出发,分别走到A,B,C,D,E,F六个节点各个节点的距离用边线表示(权),比如A–B距离5如何计算出G到其它各个节点的最短距离?如果从其它点出发到各个点的最短距离又是多少?代码解决package basic;public class原创 2020-09-26 21:58:48 · 2231 阅读 · 0 评论 -
程序员必须会的基本算法7-Kruskal算法(库拉斯卡尔算法)
Kruskal算法首先了解这个算法是用来干嘛的求最小生成树的算法主要是普里姆算法和克鲁斯卡尔算法,所以它和prim算法一样是用来用最小生成树的克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路问题背景某城市新增7个站点(A,B,C,D,E,F,G),现在需要修路把7个站点连通各个站点的距离用边线表示(权),比如A–B距离12公里如何修路保证各个站点都能连通,并且总的修建公路总里程最短?解决原创 2020-09-26 12:53:49 · 437 阅读 · 0 评论 -
程序员必须会的基本算法6-Prim算法(普利姆算法)
最小生成树问题普里姆算法要解决的就是最小生成树问题(MinimumCostSpanningTree),,简称MST。给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树最小生成树的特点:1)N个顶点就一定有N-1条边2)包含全部的顶点普利姆算法普利姆(Prim)算法求最小生成树,也就是在包含n个顶点的连通图中,找出只有(n-1)条边包含所有n个顶点的连通子图,也就是所谓的极小连通子图问题例子现在有7个村庄(A,B,C,D,E,F,G),现在需要修路把原创 2020-09-22 21:37:39 · 329 阅读 · 0 评论 -
程序员必须会的基本算法5-ST稀疏表处理RMQ问题
ST(稀疏表):Sparse Table is a data structure that answers static Range Minimum Query (RMQ). It is recognized for its relatively fast query and short implementation compared to other data structures.它是对于...原创 2020-04-07 15:40:05 · 272 阅读 · 0 评论 -
程序员必须会的基本算法4-KMP字符串查找算法(以暴力查找算法的缺点为背景)
package basic;import org.junit.Test;public class KMP{ /* * KMP算法:它是解决一个子字符串是否在文本字符串里面出现过的问题, * 如果出现过就返回最先出现的位置,否则返回-1,也叫字符串查找算法, * 在了解KMP算法之前先了解一下暴力匹配算法,详细的转到最下面阅读 * 下面说一下KMP算法 * 文本字符...原创 2020-02-27 22:59:57 · 249 阅读 · 0 评论 -
动态规划算法练习:蓝桥杯,洛谷的传纸条游戏的三种解法
目录方法一方法二方法三方法一package extraExercise;/* 算法训练 传纸条 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。 一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵, 而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。 幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对...原创 2020-02-26 16:42:03 · 977 阅读 · 0 评论 -
程序员必须会的基本算法3-分治算法(以经典的汉诺塔问题为例)
package basic;public class DivideConquer{ /* * 分治算法就是分而治之,就是把一个复杂的问题分成很多的相同或者相似的子问题, * 然后再将子问题分解成更小的子问题...一直到最后的子问题可以简单地直接解决 * 原问题地解就是子问题的解的合并 * * 分治算法的应用: * 最经典的汉诺塔问题,归并排序,快速排序,傅里叶变换...原创 2020-02-26 16:41:41 · 242 阅读 · 0 评论 -
程序员必须会的基本算法2-非递归二分查找算法
package basic;public class BinarySearch{ public static void main(String[] args) { int[] arr = {0,1,2,3,4,5,6,7}; int index = binarysearch(arr, 123); System.out.println(index); } /** * ...原创 2020-02-26 16:41:13 · 167 阅读 · 1 评论 -
程序员必须会的基本算法1-动态规划算法(以经典的01背包问题为例)
先说01背包问题的背景:现在有一个背包,容量是4,物品有三个,重量和价格如下现在要求将物品装入,使背包价值最大,但是每一样物品不能重复装,而且不能超出背包容量.这里就需要用到动态规划算法,需要创建一个二维数组数组的行表示背包的容量,最大是4,我们从0开始算,放入什么使背包价值最大,数组的列表示可以放入背包的物品,只要在这一行的上面,都是可以放入背包的物品先定义value...原创 2020-02-26 16:40:42 · 311 阅读 · 0 评论 -
栈的练习,以逆波兰计算器为例,结合中缀表达式,逆波兰表达式和栈
package stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;/* * 逆波兰计算器 * * 背景: * 计算机对于计算的表达式分为: * 前缀表达式(波兰表达式), * 中缀表达式, * 后缀表达式(逆波兰表达式) * * 前缀表达式:运算符位于操作数之...原创 2020-02-20 02:09:34 · 272 阅读 · 0 评论 -
栈实现计算器(利用的是中缀表达式)
package stack;public class Calculator{ public static void main(String[] args) throws Exception { String caculation="1-5+54645-1*2"; //一个是符号栈,一个是数的栈 Mystack1 nstack=new Mystack1(20); Mysta...原创 2020-02-15 13:16:10 · 574 阅读 · 0 评论 -
单向循环链表的创建,增加,删除(以约瑟夫环游戏为例)
package linkedlist;/* * 约瑟夫环游戏: * 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数, * 数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列, * 依次类推,直到只剩下最后一个人为止. * 这里可以使用单向循环链表来解决这个问题 */public class JosepfuGam...原创 2020-02-13 21:35:28 · 422 阅读 · 0 评论 -
双向链表的增删改查,翻转,查找倒数第N个节点
package linkedlist;public class DoubleLinkedList{ public Node1 head=new Node1("", 0); /* * 双向链表的遍历,其实和单向链表一样 */ public void show() { Node1 temp=head.next; while(temp!=null) { Syste...原创 2020-02-11 13:38:26 · 239 阅读 · 0 评论 -
单向链表的增删改查,翻转,查找倒数第N个节点
package linkedlist;import java.util.Stack;/* * 单向链表: * 现在明确要干什么: * 单向链表节点类: * 1.date域 * 2.next指针 * 3.这里给多一个int型的number类型 * * 单向链表类: * 1.一个头节点 * 3.增加节点的方法,直接在后面增加 */public class Singl...原创 2020-02-10 17:06:11 · 295 阅读 · 0 评论 -
数组模拟环形队列
package queue;/* * 数组模拟环形队列 */public class Queue{ /* * 先进行分析: * 队列必须有的东西: * 表示队头的front指针, * 表示队尾的rear指针 * 这个队列存放数据的数组对象 * 表示这个队列大小的size * * 方法有: * 加入新的元素进队列 * 删除元素 * 判断队列...原创 2020-02-09 17:32:00 · 155 阅读 · 0 评论 -
二叉排序树
package ten;/* * 二叉排序树包括 * 1.创建树时的增加节点 * 2.删除节点(重点) * 3.中序遍历的结果其实就是排好序的 */public class BinarySortTreeTest{ public static void main(String[] args) { int[] number = {9,6,12,7,23,1,33}; Bin...原创 2019-12-14 15:33:07 · 182 阅读 · 6 评论 -
八大排序算法
package ten;/* * 1.冒泡排序 * 2.选择排序 * 3.插入排序 * 4.希尔排序 * 5.快速排序 * 6.归并排序 * 7.堆排序 * 8.基数排序 */import java.io.FileInputStream;import java.io.InputStreamReader;import java.text.SimpleDateFormat;...原创 2019-11-30 16:32:00 · 139 阅读 · 0 评论 -
基数排序
/* * 基数排序 * 思路:就是先准备十个桶,每一个桶就是一个一维数组,十个就定义一个二维数组 * 每个桶的大小就是number.length,因为我们不知道这个桶可能会存多少个数据 * 所以我们做好最坏的打算,就是可能所有的数据都可能存在一个桶中 */ public int[] RadixSort(int[] number) { //先要知道这个数组里面最大数...原创 2019-11-30 16:31:07 · 150 阅读 · 0 评论 -
堆排序
/* * 堆排序 * 思路如下: * 1.就是将原本乱的数据调整成大顶堆,调整的方法就是从非叶结点开始, * 一步一步地向上面调整, * 2.就是将第一个最大的数字和最后一个位置的数字交换,然后继续调整上面的数字 * 最后一个数字就不用调整了哦 */ public int[] HeapSort(int[] number) { int temp; //第一步...原创 2019-11-30 16:30:08 · 125 阅读 · 0 评论 -
归并排序
/* * 归并排序 * 思路:其实和之前的多项式合并差不多,就是对于两部分的数组从第一个开始比较 * 如果前面小的就将前面拷贝到另外一个数组里面,如果后面的小按照前面的方法拷贝 * 当比较完后,然后两边中还有一个数组是存在数据的,就将剩下的数据全部顺序拷贝 * 但是这里比前面的多项式多了一个分开的步骤,就是将数组按照二分法递归地分成两部分 * 这样一直递归平分,对于一个数...原创 2019-11-30 16:29:20 · 118 阅读 · 0 评论 -
快速排序
/* * 快速排序 * 这里也写两个吧,一个是以中间的数为轴进行分割,一个是以开头为分割 *1.第一个是right和left都找的一个数的时候才交换, * 这时就得考虑到如果left和right有一边已经来到中间这个数的情况 * 1.1 在这之前还得注意一下"number[indexright]>middle"这个条件,因为它可能会来到中间, * 而且...原创 2019-11-30 16:28:43 · 142 阅读 · 0 评论 -
希尔排序
// 希尔排序1 // 1. 我这里每次的步长是数组长度的一半递减,就是前一个的0.5, // 这个数其实也挺接近斐波拉奇数列,斐波拉奇数列很神奇,是一种黄金分割的位置, // 不仅看起来美,而且排序的时候也贼快,但是这里就接近就好了,不使用了 // 2. 叫交换法,就是发现一个不符合顺序要求的就进行交换 // 这样子效率挺低的,比插入排序更加低 /* * 这里再解析一下吧,万...原创 2019-11-30 16:27:48 · 115 阅读 · 0 评论 -
插入排序
// 插入排序 // 就是从数组的第二个数开始,一直想后面循环,找到当前的数要插入的位置, // 比如当前数和前面一个比,如果当前数小,就将前面这个数向后移动, // 一直找到一个不比当前数小的位置,这个位置就是当前数数应该插入的地方,<( ̄︶ ̄)↗[GO!] public int[] InserSort(int[] number) { for (int x = 1; x ...原创 2019-11-30 16:27:01 · 125 阅读 · 0 评论 -
选择排序
// 选择排序 // 这里是每次选择出最小的放在最前面,其实我觉得选择排序和冒泡排序区别不是很大 // 这里的思路是:将第一个默认是最小的,然后去后面寻找,然后找到比它更加小的就进行交换 // 如果没有更加小的就不交换,然后寻找第二小的 public int[] SelectionSort(int[] number) { int min; int minindex; //...原创 2019-11-30 16:26:14 · 105 阅读 · 0 评论 -
冒泡排序及其优化
// 冒泡排序 // 每次筛选出最大的那个数放在最后面 public int[] BubbleSort(int[] number) { int temp; /* * 这个是用来优化算法的, 判断这个数组的本身或者子数组是不是本来就是有序的了, * 如果本来就是有序的就不用再次就行后面的比较了,反正也不会进行交换的 */ boolean falg = fal...原创 2019-11-30 16:25:24 · 123 阅读 · 0 评论 -
稀疏数组sparearray
/*稀疏数组sparearray * 就是我们有这样的需求:在五子棋的程序中,我们要保存棋盘上的存档, * 在棋盘上,很多位置都是没有棋子的,但是我们得保存它的数据, * 如果我们使用二维数组来保存这个棋盘,0表示没有棋子的地方,1表示黑棋,2表示蓝色棋子, * 就会有很多的无效的0,这样就很浪费内存,所以这时候就可以使用稀疏数组来表示棋盘 * 而稀疏数组的处理方法是: * 1)稀疏数...原创 2019-11-05 23:21:57 · 210 阅读 · 0 评论 -
冒泡排序、选择排序和快速排序(代码没问题)
冒泡排序:(比如从小到大的排序)冒泡排序是数组每两个相邻的元素进行比较,如果发现后面有比前面更加小的,就将前面和后面的进行交换,第一轮后就将最大的一个元素放到最后面,然后再继续进行第二轮,将次最大的元素放到了倒数第二,直到最后排序完成。(可能因为是最大的一个一个地出来,所以叫冒泡排序)代码如下:public class Test {// int [] a=new int[] {1,12,99...原创 2019-08-05 13:37:04 · 288 阅读 · 0 评论