数据结构
waS_TransvolnoS
写过两行bug,尘世间一个迷途小码农。
展开
-
从零单刷数据结构(Java描述)(一)——数据结构概论
数据结构:相互之间存在一种或多种特定关系的数据元素的集合。通常分类是逻辑结构和物理结构。逻辑结构与物理结构:逻辑结构:数据对象中数据元素之间的相互关系。分类:1)集合结构:数据同属一个集合,彼此之间没有关系2)线性结构:数据是一对一的关系3)树形结构:数据是一对多的层级关系4)图形结构:数据是多对多的关系物理结构:数据的逻辑结构在计算机中的存储方式分类:1)顺序存储...原创 2019-04-28 11:24:45 · 151 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二)——算法概论
算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。算法的特性:输入输出:算法具有零个或多个输入,至少有一个或多个输出,即算法是一定需要输出的有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受 的时间内完成确定性:算法的每一步骤都具有确定的含义,不会出现二义性可行性:算法的每...原创 2019-04-28 11:44:08 · 137 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(三)——数组
数组是一种典型的顺序存储结构,用一段地址连续的存储单元依次存储线性表的数据元素。扩展:自己动手实现可变数组import java.util.Arrays;public class MyArray { //用于存储数据的数组 private int[] elements; //构造方法 public MyArray() { elements= new int[0]; ...原创 2019-04-28 16:30:13 · 134 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(四)——查找
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。(一)顺序表查找:从表的第一个记录开始依次往后,直到最后一个记录,查找到的话返回,否则返回-1。 // 线性查找,找到返回下标的索引值,否则返回-1 public static int arrSearch(int[] arr, int target) { int index = ...原创 2019-04-29 14:52:34 · 117 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(五)——栈
栈(Stack)是限定仅在表位进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称先进后出的线性表。//手动实现栈public class MyStack { //栈的抽象为顺序表(数组) int[]arr; //构造方法 public MyStack() { arr=new int[0];...原创 2019-04-29 15:48:19 · 139 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(六)——队列
队列:队列(Queue)是一种先进先出的、只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一段称为队尾,允许删除的一端称为队头。//自己动手实现队列public class MyQueue { //队列的抽象模型也是数组 int []arr; //构造方法 public MyQueue() { arr=new int[0]; } //入队,新建...原创 2019-04-29 19:35:43 · 102 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(七)——单链表
单链表:对每个数据元素,存在一个存储数据元素信息的域(数据域),一个存储直接后继位置的域(指针域)的存储映像称为结点(Node)。n个结点链接成一个链表,因为此链表的每个结点中只包含一个指针域,所以叫做单链表。//手动实现一个单链表public class Node { // 定义一个数据域 int data; // 定义一个指针域 Node next; // 构造方法 ...原创 2019-04-29 20:43:08 · 135 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(八)——单链表的删除与插入
单链表的删除实现原理是将前一个结点的指针绕过(要删除的)下个结点,指向下下个结点。//结点定义public class Node { // 定义一个数据域 int data; // 定义一个指针域 Node next; // 构造方法 public Node(int data) { this.data = data; } // 获取结点中的数据 public i...原创 2019-05-10 12:35:34 · 289 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十八)——排序之基数排序(桶排序)
基数排序(radix sort),又称桶排序(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。如先按个位排,再将元素按十位排,再将元素按百位排…直到达到最高位。基数排序法是属于稳定性的排序,其时间复杂度为O (nlog®m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。...原创 2019-06-12 20:57:52 · 119 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十九)——树
树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。树的基本概念:根节点:如图中的A结点。双亲结点:如D是G、H、I结点的双亲结点。子节点:...原创 2019-06-13 08:55:10 · 133 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十)——二叉树
二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点:1、任何一个结点的子结点数量不超过22、左、右子树有序不可颠倒特殊的二叉树:1、斜树所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。...原创 2019-06-13 09:39:36 · 208 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(九)——循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为循环链表。//手动实现一个循环链表public class LoopNode { // 定义一个数据域 int data; // 定义一个指针域 LoopNode next = this; // 构造方法 public LoopNode(...原创 2019-06-06 17:20:26 · 113 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十)——双向链表
双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。即双向链表有两个指针域,一个指向直接后继,一个指向直接前驱。class DoubleNode{ //上一个结点 DoubleNode pre=this; //下一个结点 DoubleNode next=this; //结点数据 int data; public Do...原创 2019-06-06 20:05:57 · 98 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十一)——递归
一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数。每个递归定义必须至少有一个条件,满足时递归不再进行,即不再引用自身而是返回值退出。递归与迭代的区别是,递归用的是循环结构,迭代使用的是选择结构。递归能使程序的结构更清晰、更简洁,更容易让人理解,但是大量的递归调用回建立函数的副本,会耗费大量的时间和内存。迭代则不需要反复调用函数和占用额外的内存。//例:publi...原创 2019-06-07 16:00:57 · 103 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十二)——排序(交换排序)之冒泡排序
冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。import java.util.Arrays;class BubbleSort{ public static void main(String[] args) { int[]arr=new int[]{5,3,1,2,4}; ...原创 2019-06-07 17:01:27 · 98 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十三)——排序(交换排序)之快速排序
快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。//快速排序 //设置两个指针lo、hi指向最前、最后,分别向游标index=arr[i]靠近 public static void quickSort(int[]arr,int l...原创 2019-06-07 17:15:36 · 113 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十四)——排序(插入排序)之直接插入排序
直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表。算法复杂度O(n^2),稳定的排序算法。//插入排序 public static void insertSort(int[]arr) { //遍历所有的数字 for(int i=1;i<arr.le...原创 2019-06-07 17:54:57 · 91 阅读 · 0 评论 -
剑指Offer:30.连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 如输入数组[-1,-2,-1,0,3,-9],输出3。我在美团的二面碰到了这道题,当时的想法是不断构建可变数组,与默认值即全部元素和比较,得出结果,复杂度O(n^2),面试官要求优化到O(n)。 // 计算连续子数组的最大和 public s...原创 2019-06-08 09:13:06 · 111 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——20. 有效的括号
链接:https://leetcode-cn.com/problems/valid-parentheses给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()...原创 2019-06-18 20:46:21 · 161 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——26.删除排序数组中的重复项
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返...原创 2019-06-18 21:00:58 · 132 阅读 · 0 评论 -
从零单刷数据结构(Java描述)——哈希表
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应的一个存储位置f(key)。这种对应关系f称为散列函数,又称为哈希(Hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash Table)。关键字对应的记录存储位置称为散列地址。比如数组:arr1=[3,1,5,8,2,9],先将元素按散列函数排好...原创 2019-06-08 16:51:01 · 90 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十五)——排序(插入排序)之希尔排序
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。算法复杂度O(n^2),是不稳定的排序算法。直接插入排序,如果在基本有序的数组后来了一个较小的元素,则需要重复移动多次,希尔排序通过第一次length/2的移动改善了此问题。在这里插入代码片...原创 2019-06-08 17:07:56 · 106 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(十六)——排序(选择排序)之简单选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。算法复杂度O(n^2),一种稳定的排序算法。//选择排序 public static void selectSort(int[]arr) { //遍历所有的数 for (...原创 2019-06-08 17:54:37 · 106 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十一)——二叉树的创建
想创建一棵二叉树,首先要创建一棵带根结点的树,定义左右结点和结点的权。//定义一棵二叉树class BinaryTree{ TreeNode root; //设置根结点 public void setRoot(TreeNode root){ this.root=root; } //获取根结点 public Tree...原创 2019-06-14 09:20:26 · 190 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十二)——二叉树的遍历
二叉树的遍历有前序遍历、中序遍历、后序遍历和层序遍历。前序遍历指先遍历根结点,然后遍历左结点直到叶子节点,再遍历右结点;中序遍历指先遍历遍历左结点直到叶子节点,然后遍历根结点,再遍历右结点;后序遍历指先遍历遍历左结点直到叶子节点,再遍历右结点到叶子结点,再遍历根结点;层序遍历指按树的层级遍历;//定义一棵二叉树public class BinaryTree { public Tr...原创 2019-06-14 11:07:02 · 159 阅读 · 0 评论 -
2018爱奇艺Java笔试----1.红和绿
牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。如样例所示: s = RGRGR我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。输入描述:输入包括一个...原创 2019-06-08 20:35:48 · 393 阅读 · 1 评论 -
2018爱奇艺Java笔试----3.拼凑三角形
牛牛手中有三根木棍,长度分别是a,b,c。牛牛可以把任一一根木棍长度削短,牛牛的目标是让这三根木棍构成一个三角形,并且牛牛还希望这个三角形的周长越大越好。输入描述:输入包括一行,一行中有正整数a, b, c(1 ≤ a, b, c ≤ 100), 以空格分割输出描述:输出一个整数,表示能拼凑出的周长最大的三角形。输入例子1:1 2 3输出例子1:5import java.util...原创 2019-06-08 21:08:48 · 147 阅读 · 0 评论 -
2018爱奇艺Java笔试----2.空中旅行
牛牛有羊羊有了属于他们自己的飞机。于是他们进行几次连续的飞行。f[i]表示第i次飞行所需的燃油的升数。飞行只能按照f数组所描述的顺序进行。起初飞机里有s升燃油,为了正常飞行,每次飞行前飞机内燃油量应大于等于此处飞行所需要的燃油量。请帮助他们计算在不进行加油的情况下他们能进行的飞行次数。输入描述:输入包括两行,第一行包括两个整数n和s(1 ≤ n ≤ 50, 1 ≤ s ≤ 1000),分别表...原创 2019-06-08 21:26:27 · 142 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十三)——二叉树的查找
二叉树的查找实际上是二叉树遍历的一个应用,通过遍历二叉树来寻找给定的值,本文以前序查找为例,其他查找方式类似。//定义一棵二叉树public class BinaryTree { public TreeNode root; // 设置根结点 public void setRoot(TreeNode root) { this.root = root; } // 获取根结点...原创 2019-06-14 11:31:34 · 123 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十四)——二叉树结点的删除
二叉树结点的删除需要考虑如果要删除的不是叶子节点则需要递归删除整个子树。//定义一棵二叉树public class BinaryTree { public TreeNode root; // 设置根结点 public void setRoot(TreeNode root) { this.root = root; } // 获取根结点 public TreeNode ge...原创 2019-06-14 14:50:50 · 204 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——13. 罗马数字转整数
链接:https://leetcode-cn.com/problems/roman-to-integer罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D ...原创 2019-06-14 16:40:34 · 104 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——14. 最长公共前缀
链接:https://leetcode-cn.com/problems/longest-common-prefix编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公...原创 2019-06-14 20:58:19 · 116 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十五)——顺序存储的二叉树
顺序存储的二叉树即逻辑结构是二叉树,存储结构不同于前面的链式存储而是顺序存储的二叉树。顺序存储的二叉树为了保证存储连续,通常只考虑完全二叉树。逻辑结构:存储结构:顺序存储的二叉树的性质:1.第n个元素的左子结点的下标是2*n+1;比如:权为3的结点,其左子结点的下标是2*2+1=5;2.第n个元素的右子结点的下标是2*n+2;比如:权为3的结点,其右子结点的下标是2*2+2...原创 2019-06-15 10:29:56 · 138 阅读 · 0 评论 -
从零单刷数据结构(Java描述)(二十六)——排序之堆排序
堆排序(Heap Sort)是利用堆(本文使用大顶堆)进行排序的方法。它的基本思想是, 将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值) ,然后将剩余的 n-1 个序列重新构造成一个堆,这样就得到 n 个元素中的次小值。如此反复执行, 便能得到一个有序序列了。堆是具有下列性质的完全二叉树:每个结点...原创 2019-06-15 11:33:31 · 114 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——16. 最接近的三数之和
链接:https://leetcode-cn.com/problems/3sum-closest给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.与 target 最接近的三个...原创 2019-06-16 17:14:13 · 121 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——17. 电话号码的字母组合
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd...原创 2019-06-16 17:16:51 · 145 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——27. 移除元素
链接:https://leetcode-cn.com/problems/remove-element给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = ...原创 2019-06-20 20:34:15 · 112 阅读 · 0 评论 -
从零单刷Leetcode(JAVA描述)——28. 实现strStr()
链接:https://leetcode-cn.com/problems/implement-strstr实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = “hello”, needle = “...原创 2019-06-20 20:45:51 · 125 阅读 · 0 评论 -
剑指offer:28.使用Map找出数组中出现次数超过数组长度一半的元素
我在字节跳动一面碰到了这个问题,面试官示意用Map实现,复杂度O(n)。//思路:用Map的Key存元素,Value存出现次数public static int moreThanHalf(int[]arr){ Map<Integer,Integer>map=new HashMap<>(); int res=0; map.put(arr[0],1); ...原创 2019-06-21 11:26:08 · 235 阅读 · 0 评论 -
找出数组中第二大的值
我在腾讯一面碰到了这个问题,当时一看到就说想到了三种解法:1.排序,快排复杂度O(nlogn);2.暴力,两层循环复杂度O(n2);3,定义初值最大值、最小值为首尾中偏大、偏小的值,(本来想用HashMap或者首尾指针分治)但其实一个循环就出来了,复杂度O(n);//找出数组中第二大的数 public static int findSec(int[]arr){ if(...原创 2019-06-17 16:03:42 · 524 阅读 · 0 评论