
数据结构与算法
在河之洲木水
这个作者很懒,什么都没留下…
展开
-
数据结构与算法系列 -- 两个大数的相加 与相乘
1. 题目: 两个大数(位数较大,现有的整形无法存储)相加,比如:计算123456789987654321 与987654321123456789 相加的和Java代码如下:public class BigData { List<Integer> convertToNumber(String data){ List<Integer> result = new LinkedList<>(); for(int i=...原创 2020-05-31 10:33:35 · 750 阅读 · 0 评论 -
数据结构与算法系列 -- 图遍历
1.广度优先搜索(BFS)广度优先搜索(Breadth-First-Search),简称为 BFS。直观地讲,它其实就 是一种“地毯式”层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次 往外搜索。过程图如下: BFS代码如下:class Graph { public int v; //顶点个数 public LinkedList<Integer>[...原创 2020-05-30 15:56:05 · 158 阅读 · 0 评论 -
数据结构与算法 -- 利用堆排序
建堆结束之后,数组中的数据已经是按照大顶堆的特性来组织的。数组中的第一个元素就是 堆顶,也就是最大的元素。我们把它跟最后一个元素交换,那最大元素就放到了下标为 n 的位置。 然后再通过堆化的方法,将剩下的 n − 1 个元素重新构建成堆。堆化 完成之后,我们再取堆顶的元素,放到下标是 n − 1 的位置,一直重复这个过程,直到最 后堆中只剩下标为 1 的一个元素,排序工作就完成了。Java代码如下:public class MyHeap { @Test ..原创 2020-05-17 16:44:30 · 146 阅读 · 0 评论 -
数据结构与算法系列 -- 获取最大(最小)的 top 元素
当我们面试的时候,常常会有面试官问我们,如何获取批量数据中最大(最小)的 top n个元素,答案是:选择小顶堆(大顶堆)的数据结构来实现下面以获取最小的 top n元素为例public class HeapTest{ //获取最小的 top 元素 @Test public void getTopMin(){ int[] data = {33,76,34,66,22,31,13,25,90,87,56,65,66,9,6,8,3,77,98原创 2020-05-17 16:31:12 · 449 阅读 · 0 评论 -
数据结构与算法系列 -- 快速排序算法
快排利用的也是分治思想。乍看起来,它有点像归并排序,但是思路其实完全不一样 快排的思想是这样的:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r之间的任意一个数据作为 pivot(分区点)。 我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p到 q-1 之间都是小于 pivot...原创 2020-05-17 14:23:49 · 256 阅读 · 1 评论 -
数据结构与算法系列 -- 归并排序
归并排序的核心思想还是蛮简单的。如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。如下图,针对数组:11、 8、 3、 9、7、1、2、5,归并排序的过程如下 伪代码如下:void test(){ merge_sort(data,0...原创 2020-05-17 14:00:32 · 166 阅读 · 0 评论 -
数据结构与算法系列 --- 冒泡、插入与选择排序
1、冒泡排序算法冒泡排序思想: 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否 满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在 的位置,重复 n 次,就完成了 n 个数据的排序工作。 public class SortTest { private void swap(int[] data,int i,int j){ int tmp = data[i]; ...原创 2020-05-17 13:26:04 · 191 阅读 · 0 评论 -
数据结构与算法系列 --- 栈在表达式求值中的应用
题目利用计算机计算算数表达式,只包含加减乘除四则运算,比如:34+13*9+44- 12/3思路:通过两个栈来实现的。其中一个保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,我们就直接压入操作数栈;当遇到运算符, 就与运算符栈的栈顶元素进行比较。如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先 级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取 2 个操作数,然后进行 计算,再把计算完的结果压入操作数栈,继续比较。publi.原创 2020-05-10 16:26:17 · 428 阅读 · 0 评论 -
数据结构与算法系列 -- 查找链表的中间节点
题目: 查找链表的中间节点比如:有链表1->3->5->8->9->10->12->11->17 ,其中间节点为9思路:定义两个指针,分别为slow与fast,同时从头节点开始往尾节点移动,slow每次移动一个节点,fast每次移动两个节点,直到fast到了尾节点后,停止移动,此时slow指向的节点就是中间节点。public class LinkedList { public void print(LinkedNode<I...原创 2020-05-10 13:53:35 · 282 阅读 · 0 评论 -
数据结构与算法系列----删除链表倒数第 n 个结点
题目: 删除链表倒数第 n 个结点* 例子:删除倒数第4个节点 1->3->5->8->9->10->12->11->17* 结果为:1->3->5->8->9->12->11->17* 思路:先让指向头结点的指针 tmp 先向下走 n 个节点,接着头结点 head 与tmp同时走,指导tmp节...原创 2020-05-04 21:58:20 · 146 阅读 · 0 评论 -
数据结构与算法系列---判断两个无环链表是否相交
题目: 判断两个无环链表是否相交public class LinkedList { public void print(LinkedNode<Integer> root){ LinkedNode<Integer> tmp = root; while (tmp!=null){ System.out.p...原创 2020-05-04 21:35:31 · 181 阅读 · 0 评论 -
数据结构与算法--判断环存在与否
给一个单链表,判断其中是否有环的存在 两个思路:1、如果链表元素没有重复的,则可以用一个set集合存放链表的value,查看是否有重复的 2、如果有重复的,可以设置两个快慢指针fast、slow,若是fast能够追上slow则有环public class LinkedList { public void print(LinkedNode<Integer&g...原创 2020-05-04 21:14:37 · 500 阅读 · 0 评论 -
数据结构算法学习系列---- 两个有序的链表合并
a3、题目 两个有序链表序列的合并,要求:不增加新的空间,只进行指针的操作 例如:有两个单链表 list1: 1 -> 3 -> 5 -> 8 -> 9 ,list2 : 2-> 4 -> 6 -> 7 -> 10 ,合并 class LinkedNode<T> { pub...原创 2020-04-25 16:17:29 · 355 阅读 · 0 评论 -
数据结构算法学习系列---求子数组的最大和
2、题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值,并输出该子数组。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,9,-6 和最大的子数组为3, 10, -4, 7, 2,-5, 9,-6 因此输出为该子数组的和22。分析:当我们加上一个正数时,和会增...原创 2020-03-29 18:46:33 · 252 阅读 · 0 评论