数据结构
数据结构
shadow___h
这个作者很懒,什么都没留下…
展开
-
排序算法小节
冒泡排序package 冒泡排序;/** * 时间复杂度 : O(n2) * 空间复杂度 : O(1) * 稳定排序 * */public class BubbleSort { public static void commonSort(int[] nums) { for (int i = 0; i < nums.length; i++) { for (int j = nums.length-1; j > i; j--) {原创 2020-12-22 13:51:11 · 339 阅读 · 1 评论 -
二叉树的简单理解
二叉树二叉树的定义 :二叉树是由n个节点的有限集合,该集合可以为空集,或者由一个根界定和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成。我就可以把他理解为每一个点最多可以连三个点,但根节点最多只能连两个点。二叉树一般是具有五种形态:空二叉树,只有一个根结点,根结点只有左子树,根结点只有右子树,根结点有左子树又有右子树。但是这个不重要。我们要清楚的了解什么是完全二叉树和满二叉树满二叉树可以就是说所有的分支结点都存在左子树和右子树,并且所有的叶子都在同一层上,如图所示完全二叉树就是从原创 2020-11-15 19:51:15 · 991 阅读 · 0 评论 -
栈和队列的基本实现
栈和队列栈和队列都是一种特殊的链表栈栈是仅限定于在表尾进行插入和删除操作的线性表。栈就相当于一个箱子,你往里面放书,最先放进去的书,我们取得时候就要把上面的书全部拿出来才可以将第一本放进去的书拿出来。它遵循的是先进后出的规则它的底层实现可以分为顺序表和单链表两种的实现方式。它的两种实现方式插入和删除的基本操作时间复杂度都是O(1);链表实现栈package myStack;class Node { public Integer val; public Node ne原创 2020-11-14 16:23:37 · 80 阅读 · 0 评论 -
顺序表和单链表的区别 以及顺序表和单链表的代码
链表中顺序表和单链表的区别存储分配方式的不同顺序表一段连续的存储单元一次存储线性表的数据元素顺序表代码的实现,其本质就是一个数组和最大容量(也就是数组的长度)以及现有的长度。当我们每存储进一个数据的时候,他的现有长度增加,当增加到最大的容量的时候,我们就需要给顺序表扩容。我们很难把顺序表的空间容量全部利用。与单链表相比它无须为表中元素之间的逻辑关系增加额外的存储空间单链表 1. 采用的链式存储结构,用一组任意的存储单元存放线性表 2. 就是我们添加了一个引用,这个引用中存放了下原创 2020-11-13 16:04:30 · 1894 阅读 · 0 评论 -
手撕 hashMap 和 hashSet java代码(拉链法)
哈希表的本质就是一个数组,但是不管是对这个数组进行插入删除和查找操作,其时间复杂度接近于O(1);但是这个数组中不会出现重复的元素,比如一个哈希表中已经有了元素1和2,当我们再往里面插入一个元素1的时候,就插不进去了。就是根据哈希函数得到哈希值然后找到下标然后查看这个位置的是否有元素,没有元素则直接插入,有元素则比较是否一样,一样的话就是插入失败,(拉链法)。以 <key, value> 值得mappackage myHash;import java.util.Objects;c原创 2020-11-04 22:04:27 · 211 阅读 · 0 评论 -
双向链表的实现(带头傀儡节点)
代码有注释class ListNode { public int val; public ListNode prev; public ListNode next; public ListNode() { } public ListNode(int val) { this.val = val; }}publi...原创 2020-04-02 17:07:55 · 544 阅读 · 1 评论 -
反转单链表(只可以遍历一次)
反转单链表的意思就是原来单链表的值为1>2>3>4>5反转之后会变成5>4>3>2>1我们需要了解的是一定不能重新创建一个单链表来进行反转,因为那样太简单了,并且是极度浪费空间和资源的,有时候实在oj上跑不过的首先我将单链表的有关代码放在这里import com.sun.deploy.net.proxy.ProxyUnavailableEx...原创 2020-03-28 23:43:13 · 227 阅读 · 0 评论 -
单链表(无头的,单循环的)
话不多说,有注释import com.sun.deploy.net.proxy.ProxyUnavailableException;class Node {//节点类 public int data; public Node next; public Node() { } public Node(int data) { this....原创 2020-03-27 17:06:58 · 365 阅读 · 0 评论 -
java数据结构 顺序表
不多说上代码 有注释Java中顺序表的实现import java.util.Arrays;public class SeqList { public int[] elem;//null public int usedSize;//0 //设置默认容量 public static final int DEFAULT_SIZE =...原创 2020-03-24 21:36:14 · 97 阅读 · 0 评论 -
反射,枚举,以及lambda
反射:面向对象的三大特征为“封装,继承,多态”而反射其实也是面向对象的一个特性。反射其实就是让一个对象在运行的时候,可以清楚的认清自己。比如让自己知道自己有哪些属性,有哪些方法,以及每个属性的名字,是啥类型。java在运行的时候,会将java语言装换成一个.class文件,并且将其加载在内存中时,jvm也就是java的运行环境会使用一个专门的对象来描述这个.class文件的内容。每个类在使用的时候都需要将对应的.class文件加载在内存中。(每一个类不管在代码中被使用多少次,对应的类对象一定只有一原创 2020-05-22 17:34:05 · 117 阅读 · 0 评论 -
简单描述哈希冲突,如何处理哈希冲突,以及哈希表的简单代码
哈希表:理想情况下可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函 数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快 找到该元素。向哈希表中插入元素,根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。向哈希表中对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若 关键码相等,则搜索成功但是当两个数通过哈希函数所编的关键码相同时,将这两个原创 2020-05-16 23:01:59 · 428 阅读 · 0 评论 -
Java中简单的构建二叉搜索树
我们用键值对来表示树的节点然后重写toString方法确保可以打印出来,来判断其中有些方法的实现insert为插入方法find为查找方法remove为删除方法inOrder和perOrder是为了遍历二叉树,然后根据中序和前序遍历来确保构建的二叉搜索树是否正确public class BinarySearchTree { static class TreeNode { public int key; public int val; pu原创 2020-05-13 23:36:14 · 299 阅读 · 0 评论 -
java中的堆排序
package 堆排序;//第一种方法//升序排列,建立小堆,每次取堆定元素,放到一个额外的数组中,循环取n次//空间复杂度O(n)//第二种方法//升序排列,建立一个大堆,每次取堆顶元素,和最后一个元素进行交换,再从堆顶位置开始往下调整,调整好堆结构。//时间复杂度O(NLogN)//空间复杂度O(1)//不稳定排序//我们这里用第二种方法import java.util.Arrays;public class Test { public static void s原创 2020-05-13 23:30:46 · 167 阅读 · 0 评论 -
Map,Set的简单应用
Map.Entry<K, V> 即 Map 中定义的 K 类型的 key 和 V 类型的 value 的映射关系的类。也就是说是对键值对,通过K映射到V。V get(Object key) : 返回 key 对应的 valueV getOrDefault(Object key, V defaultValue) :返回 key 对应的 value,key 不存在,返回默认值V put(K key, V value) :设置 key 对应的 valueV remove(Object ke原创 2020-05-12 22:56:55 · 75 阅读 · 0 评论 -
归并排序(递归写法,非递归写法)
package 归并排序;//时间复杂度 O(NLogN)//空间复杂度 O(N + LogN) = O(N)//稳定排序//归并排序可以高效对链表进行排序//数组可以进行随机访问,链表只能取next,堆排序,快速排序,希尔排序无法高效运用到链表上//归并排序可以高效的进行“外部排序”,是一种“外部排序”的主要实现方法//外部排序:数据在磁盘上(外存中),数据量非常大,无法全部加载到内存中。import java.util.Arrays;public class Test {原创 2020-05-10 00:16:07 · 197 阅读 · 0 评论 -
快速排序(递归写法,非递归写法)
package 快排;import java.util.Arrays;import java.util.Random;import java.util.Stack;//时间复杂度:最坏情况O(N^2) 对一个降序的数组,用快排进行升序排序// 平均情况O(NLogN)//空间复杂度:最坏O(N) 平均 O(LongN)//不稳定排序public class Test { //快速排序递归写法 public static void sort原创 2020-05-10 00:12:18 · 298 阅读 · 0 评论 -
java中的自定义布局(精确布局)
Java中的布局方式是由多种的分别为流式布局,边界布局,网格布局,以及我们经常用的精确布局。java中的GUI(图形用户界面)分别位于java.awt和java.Swing包中。我们可以布局一个简单的计算器的界面来了解如何去精确布局import javax.swing.*;import java.awt.*;public class Cal extends JFrame { ...原创 2020-05-05 12:42:03 · 2779 阅读 · 1 评论 -
java中的希尔排序
希尔排序本质上和插入排序差别不大。就是将一个较长的数组,分成好几个长度相同的数组,然后比较不同数组种相同位置值的大小,进行排序后,将数组慢慢排序趋于有序,然后将分组扩大,直至这个数组有几个值就有几个分组。package 希尔排序;import java.util.Arrays;public class Test { public static void shellSort(...原创 2020-05-05 12:27:10 · 163 阅读 · 0 评论 -
java中插入排序的实现
具体代码如下package 插入排序;import java.util.Arrays;public class Test { public static void insertSort(int[] array){ for (int i = 1; i < array.length; i++) { int tmp = array[i...原创 2020-05-05 12:21:09 · 102 阅读 · 0 评论 -
topK问题
topk问题有两种解决方案1:成立一个优先队列,循环输出k次这个树的根节点。2:成立一个有k个元素的堆。我们主要写一下第二种解决方案。package topK;//寻找n个元素中前k大的数//建立一个大小为k的堆,堆定元素就是这个k个元素中的最小值A,//循环遍历n个元素中的每个元素,如果比堆定元素大,直接替换A。//并且向下调整堆,得到新的A,当n个元素遍历完之后,//堆中元...原创 2020-05-05 10:24:33 · 133 阅读 · 0 评论 -
利用树的特点来构造优先队列
构造优先队列我们需要引入一个堆的该概念堆堆在逻辑上一个完全二叉树堆在物理上是一个数组满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者大堆 ; 反之,则是小堆,或者小根堆,或者小堆。堆的基本作用是,快速找集合中的最大值或者最小值建堆是根据向上调整,和向下调整同时完成的我们所建的堆未考虑扩容,建堆的代码为大堆代码。public class MyPriorityQueu...原创 2020-05-04 23:33:43 · 156 阅读 · 0 评论 -
不用递归方法的树的遍历
package src2;import java.util.Stack;public class BuildTree { static class Node { public char val; public Node left; public Node right; public Node(char val) {...原创 2020-04-27 23:21:01 · 1134 阅读 · 0 评论 -
树的无返回值遍历和有返回值遍历,以及树的一些基本方法
第一种树的简单遍历public class Test_Tree { static class Node { public char val; public Node left; public Node right; public Node(char val) { this.val = val;...原创 2020-04-20 22:05:23 · 221 阅读 · 0 评论 -
二叉树的先序遍历
如上图所示,这是一个标准的二叉树二叉树的先序遍历结果为 A B D G H E C F I二叉树的遍历是一种递归的思想如上图所示,一层的一层的传递下来,再一层层的传上去public class Test_Tree { static class Node { public char val; public Node left; p...原创 2020-04-18 20:12:59 · 403 阅读 · 0 评论 -
括号匹配问题
我感觉这个问题是需要用栈来解决的 //构建一个字符串,其中只有{}[]()六种字符 //构建一个函数,看输出的字符串中括号是否匹配,匹配的返回true,不匹配返回falseimport java.util.Stack;public class StackQueueInterview { public static boolean isValid(String s){ ...原创 2020-04-15 22:47:38 · 197 阅读 · 0 评论 -
栈和队列分别用顺序表组和链表表示
栈的两种表示方法public class MyStack { public int[] arrays = new int[100]; public int userSize = 0; public MyStack() { } public MyStack(int[] arrays) { this.arrays = arrays; ...原创 2020-04-15 22:26:43 · 193 阅读 · 0 评论 -
杨辉三角的实现(非负整数)
用链表来实现,import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Generate { public static List<List<Integer>> generate(int numRows) { List<...原创 2020-04-14 23:36:20 · 160 阅读 · 0 评论 -
Java中扑克牌的简单构建
import java.util.*;public class Poker { static class Card { public String suit;//花色 public String num;//数字值 public Card(String suit, String num) { this.suit...原创 2020-04-14 00:04:30 · 253 阅读 · 0 评论 -
简单的了解泛型,Collection与Map
泛型的简单应用集合可以存储任何类型的对象,但当把一个对象存入集合后,集合不会记得的这个对象的类型,也就是说把这个对象从集合中取出来的时候,编译时会把这个对象看为object类型,而若是做强制类型转换的话是非常容易出错的。因此我们引入了泛型。我们要明白的是在泛型是在程序编译期间的一种机制,而在运行期间是没有这个概念的。Collection<String> collection = ...原创 2020-04-12 13:01:18 · 105 阅读 · 0 评论 -
用java实现一个简单的图书管理系统
首先我们需要实现有关书的两个类package Book;public class Book { private String name;//名字 private String price;//价格 private String author;//作者 private boolean isBorrow;//是否借出 public Book() { ...原创 2020-04-12 00:14:05 · 1760 阅读 · 4 评论 -
String的常量池和String不可变
字符串常量池String str1 = "hh";String str2 = "hh";String str3 = "hh";System.out.println(str1 == str2);//trueSystem.out.println(str2 == str3);//true我们应该知道String是一个引用类型,str1 str2 str3 内存储的是这个"hh"的地址,这就...原创 2020-04-08 17:50:05 · 209 阅读 · 0 评论