自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 网络之TCP、UDP

TCP和UDP是传输层协议(具体网络分层请戳这里网络分层),者之间有很大的不同,写篇博客记录一下吧。UDP VS TCPUDP:无连接,不可靠,面向数据报,没有发送缓冲区有接收缓冲区TCP:有连接,可靠,面向字节流,有发送缓冲区和接收缓冲区UDP不保证性能,但其性能较好,TCP是实现安全与性能之间的平衡,这里主要记录TCP的一些原理,UDP对比TCP即可理解。TCP安全机制:确认应答机制,超时重传机制,连接管理机制,流量控制以及拥塞控制TCP协议头(1)确认应答机制:由..

2020-09-08 19:59:04 244

原创 网络之网络分层+网络传输流程

这部分都是些理论的知识,不太好记忆,写篇博客加深一下印象吧。网络分层理论上说,是七层模型,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。但我们一般讨论的是五层或四层模型,分别是:应用层,传输层,网络层,数据链路层,物理层(四层模型中不包括物理层)。对每层的代表硬件,使用协议等一些其他的东西汇总在下面的表格中。 协议/技术 代表硬件 补充 应用层 http、DNS、NAPT 主机应用程序 传输层 ...

2020-09-08 17:02:26 1004

原创 幸运大抽奖

由于最近关注的一个主播老是爱抽奖送礼品,这就成功引起我对抽奖系统的兴趣,自己简单的做了一个抽奖系统,下面简单记录一下。开发环境:window/mac,idea(或者其他集成开发环境,本人用的是idea)技术支持:Maven、Lombok、Spring、SpringMVC、SpringBoot、MySQL、Mybatis、Druid项目功能:用户操作,包括:登录,注册,注销; 奖项设置,包括:增加,修改,删除; 参与抽奖人员设置,包括:增加,修改,删除。 抽奖设置,包括:设置每次可抽取的

2020-09-03 21:58:31 300

原创 数据结构之基数排序

基数排序也称“桶子法”,通过元素各个位的值将元素分配到对应的桶子中,达到排序的效果,是稳定的排序。用基数排序法排数组中的元素的基本思路如下:将数组中元素按位数及其每位对应的数(从低位到高位数)放入对应的桶中; 全部放入桶中后,再将桶子中的元素按顺序放入原数组中; 继续下一位。加一张图来帮助理解吧下面来实现代码package com.ma.redixsort;import java.util.Arrays;//基数排序即桶子排序public class RedixSo

2020-08-17 17:42:42 293

原创 数据结构之归并排序

归并排序是利用分治策略来实现的一种排序方式,分治法是先将一个问题划分成多个小问题递归求解,然后在将每个小问题处理的结构整合在一起,这一步称为治,最终解决了这个问题。示意图如下所示:图中是对数组arr={8,4,5,7,1,3,6,2}排序,先将数组分开,在对分开的数组合并。代码如下:package com.ma.sort;import java.util.Arrays;public class MergeSort { static int count = 0; pu

2020-08-14 15:18:01 175

原创 数据结构之快速排序

快速排序也属于内部排序,他是对冒泡排序的改进。基本思想是:在一趟排序时,选定一个值(一般选数组的中间值),在这趟排序过程中将数组中小于这个中间值数放在数组左边,大于中间值的数放在数组右边,然后在继续按照这种方法将左右两边的数进行快速排序,最终得到有序数组。示意图如下:下面是用递归实现的快排:public class QuickSort { public static void main(String[] args) { int[] arr = {-9,78,0,23,-

2020-08-14 10:44:29 118

原创 数据结构之插入排序

插入排序也属于内部排序,是以插入的方式寻找元素的适当位置。基本思想:将n个待排序的元素看作一个有序列表和一个无序列表,开始时有序列表中有1个元素,无序列表中有n-1个元素,每次插入时从无序列表中取出第一个元素,将这个元素与有序列表中的元素比较大小,找到其合适的插入位置,即可得到一个有序列表。思路图如下所示:代码如下所示:/** * 插入排序:将列表看成是一个有序列表和一个无序列表,每次把无序列表中的第一个元素插入到有序 * 列表的合适位置。 */public class Inser

2020-08-13 11:33:17 137

原创 数据结构之冒泡、选择排序

冒泡排序和选择排序都属于内部排序,这两种排序方式的平均时间复杂度和最坏时间复杂度都是,并且他们都适用于数据比较少的情况下使用,不同的是冒泡排序比选择排序更稳定。下面分别聊聊这两种排序方式吧。一、冒泡排序冒泡排序是对待排序序列下标有小到大开始遍历比较,若这两个元素逆序,则交换,不逆序则继续比较一下一个,比较数组长度-1趟即可。若是某一趟没有交换,则证明这个数组序列有序,退出即可。代码如下:/** * 冒泡排序:每一趟都只是比较相邻两个数的大小,再按照给定规则交换 * 优化:要是某一趟中没有进

2020-08-12 11:49:13 198

原创 数据结构之8皇后问题

在看这篇博文之前,大家可以先玩玩8皇后游戏,在此附上游戏连接点此开始游戏之旅!8皇后游戏规则是任意在8*8的棋盘上摆放8个皇后,并且这8个皇后之间不能相互攻击(即任意两个皇后不能在同一行,同一列,同一条斜线上)。问:总共有多少种摆放?总共进行了多少次冲突检查?在玩游戏的时候明显感觉大脑不足,写个代码帮我找一些摆放方式吧!实现是利用递归,一维数组实现。8*8棋盘本应该用一个二维数组存放,但是由于8皇后问题的特殊性,选择一个长度为8的一维数组也可达到此效果。用数组的下标表示第i+1个皇后,每个皇后放

2020-08-12 09:58:06 518

原创 设计模式之代理模式

代理模式是结构型模式,可在目标对象实现的基础上扩展功能。代理模式分为静态代理,动态代理,cglib代理;静态代理其目标类和代理类都要实现接口;动态代理其目标类实现接口,代理类不需要实现接口,动态代理也称为JDK代理;cglib代理任何类都不用实现接口。值得注意的是,cglib代理是借助cglib提供的工具实现代理,所以在实现之前需要导入一下四个包:除此之外,cglib代理时,要求目标类不能有final关键字,由于这个代理方式是对方法的拦截,因此目标类的方法上也不能有final或者static关键

2020-08-11 18:01:52 75

原创 设计模式之简单工厂模式

设计模式中的工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式三种,其中简单工厂模式应用最多。与单例模式一样,工厂模式也是创建型模式,不同的是单例模式是让别的类只创建一个该类的实例,工厂模式则是将创建对象实例代码封装到一个工厂类中,别的类创建对象时调用工厂类创建即可,提高了代码的可扩展性,遵守ocp原则。下面以披萨店为应用场景,模拟实现简单工厂模式。Pizza.javapublic abstract class Pizza { protected String name;

2020-08-11 15:22:18 74

原创 数据结构之中缀表达式转后缀表达式

对于计算机来说,后缀表达式更方便计算,但是对于我们来说,中缀表达式更方便理解。为了大家都方便,下面就聊聊如何把一个中缀表达式借助代码转化成一个后缀表达式。在实现转后缀表达式时,用栈结构存储操作符,由于中间结构不用出栈,并且如果用栈结构存储,那么将出栈结果逆序才是我们要的后缀表达式,所以用List存储即可,下面先来说说转化过程的思路:若当前元素是数字,直接入list; 若当前元素是左括号(,直接入stack; 若当前元素是右括号),将stack中的元素出栈,并入list中,直到遇到左括号停止,并将

2020-08-11 11:16:52 322

原创 数据结构之逆波兰计算器

逆波兰计算器也称为后缀计算器,逆波兰表达式形如“30 4 + 5 * 6 -”,其对应的中缀表达式为“(30+4)*5-6”,这次我利用栈结构实现一个逆波兰表达式的简单版计算器。先说说实现思路:先将表达式转化成list集合; 顺序遍历集合,如果当前元素是数字,压入栈中;如果当前元素是操作符,弹出栈中的两个元素进行计算,并将结果压入栈中,直到集合中的元素全部遍历完; 栈中最后的元素就是计算结果。代码:public class PolandNotation { public static

2020-08-11 09:28:09 177

原创 数据结构之中缀表达式计算

我们在计算机器中输入“7*2*2-5+1-5+3-4”,就能很快得到结果18,那么如何利用栈结构模拟实现计算机呢?下面就来聊聊在编写代码时的思路,注意点以及代码(我只考虑了简单的加减乘除运算,其中包含多位数的计算)。思路:先创建两个栈,一个数据栈和一个操作符栈; 通过index值,初始值为0,遍历表达式; 若是数,直接入数字栈; 若是操作符,判断操作符栈是否为空,空则直接入操作符栈,否则,判断当前操作符与操作符栈的栈顶元素的优先级,若当前操作符优先级<=操作符栈的栈顶元素的优先级,则从数

2020-08-06 17:53:00 922

原创 设计模式之单例模式

什么是设计模式?设计模式不是代码,而是一种解决某类问题的一种通用方法,可以提高代码的维护性,扩展性和通用性。降低代码或软件的复杂度。设计模式不局限于某种语言,Java,Python,C++均设计到设计模式。单例设计模式是在某个软件中采用某中方法使得某个类只存在一个对象。单例模式的四个步骤如下:构造器私有化(防止在类的外部new); 提供静态私有的属性; 在类的内部创建对象; 提供一个静态的公共方法,在外部取得此类对象。先聊聊饿汉式的单例模式,代码如下://方法一:静态属性class

2020-08-06 11:51:39 90

原创 数据结构之约瑟夫环

先来聊聊什么是约瑟夫环,有编号为1,2,3...n个小朋友围成一圈坐,让编号为k[1,n]的下朋友开始从1报数,数到m的那个小朋友出圈,下一个小朋友接着从1开始报数,数到m的小朋友继续出圈,循环执行此操作,直至圈中所有小朋友都出圈,由此得到的出圈编号。这里我用单向环形链表来实现约瑟夫环,在添加每个节点时,让新加入的节点的next域指向第一个节点first。下图是一个单向环形链表。由于单链表不能实现自我删除,所以我们需要一个helper指针指向待删除节点的前一个节点。假设从第一个节点开始,firs

2020-08-06 09:06:07 1623

原创 数据结构之双向链表

在实现了单链表的增删改查的基本操作之后,我们能发现单向链表只能从头节点开始向后查找,不能从后向前查找;在实现删除节点功能是发现,单链表不能自我删除,每次删除某个节点都要找到要删除节点的前一个节点temp作为辅助节点,才能完成删除。对于双向链表来说,既可以从前往后查找,又可以从后往前查找;删除节点时可以自我删除,不需要借助辅助节点(temp.next=temp.next.next完成自我删除)。下面对双向链表的增删改查操作用代码实现:public class DoubleLinkedList {

2020-08-05 08:42:35 115

原创 数据结构之带头结点单链表面试题public int getLength(Node head){ if (head.next == null){ return 0

一、得到链表中的有效节点个数,不包括头节点。这个题较简单,不啰嗦直接上代码:public int getLength(Node head){ if (head.next == null){ return 0; } //链表中的第一个节点 Node cur = head.next; int count = 0; while (cur != null){ co

2020-08-04 10:54:29 796

原创 数据结构之单链表(带头节点)

今天来聊聊单链表。单链表是以节点存的链式结构,分为带头节点和不带头节点的单链表。单链表中的节点包括data域和next域,data域存储元素的值,next域则存储下一个节点的地址。单链表中的各个节点在内存中不一定是连续存储的,存储形式如下图所示:从图中可以看出,单链表中的各个节点并不是连续存储的。带头结点的单链表结构图如下图所示:聊完单链表的基本知识,下面以对明星节点的增删改查操作为案例,实现对单链表的增删改查操作。先说明节点结构:public class Node { p

2020-08-04 10:37:31 2044

原创 数据结构之队列

先来聊聊队列的特点:①队列是一个有序列表,可以用数组或者链表实现②入队列和出队列是从队列的两端操作的,遵循先进先出原则。类似的我们在食堂排队买饭。下面分别是基于数组实现的普通队列和循环队列普通队列:front指向队列第一个元素的前一个,默认值是-1;rear指向队列的最后一个元素默认值是-1,maxSize为栈最多存放多少个元素。Java实现代码如下:public class Test1 { private int front; private int rear

2020-08-03 11:36:03 144

原创 数据结构之稀疏数组

先来简单聊聊什么是稀疏数组。稀疏数组的行数由原始数组中有效元素个数决定,由于稀疏数组本身需要存储原始数组的行数、列数,所有稀疏数组的行数为原始数组中有效元素个数+1,列数为3,分别是有效元素在原始数组中的行数、列数以及值。稀疏数组可以缩小一个大部分元素为0或者是同一元素的数组的规模,并存放。好了,上图帮助小伙伴们理解吧!左边的是原始数组,其中大部分元素是0,存储规模较大;右边是其对应的稀疏数组,第一行是原始数组的行数、列数以及有效元素个数,其余行分别对应不同有效元素的行数、列数以及元素值,缩小了存储

2020-08-03 09:27:41 160

原创 简述三个特殊类

一、String类1.1实例化。    String类的实例化方法有两种:1.直接赋值,2.构造方法。    1.直接赋值法: //这样的赋值方式只会开辟一块内存空间,并且若字符串是第一次出现则自动入池,供下次使用。 2.构造方法: String str=new String("hello world");//这样会开辟两块堆内存空间,其中一块会成为垃圾...

2018-11-06 17:21:05 286

原创 java中final关键字

在java中final被称为终结器,可以使用final关键字来定义类,方法,属性。1:final修饰类:修饰类时,该类不能被继承既不能有子类,所以final与abstract不能同时使用;2:final修饰方法:修饰方法时,该方法不能被覆写。3:final修饰属性:修饰属性时,属性的值不能改变,并且要初始化(可以在声明时初始化,也可在构造方法,构造块处初始化)。修饰普通数据类型的变...

2018-10-22 11:13:29 136

原创 java内部类

先来简单介绍一下内部类的定义。所谓的内部类就是在一个类的内部进行其他的类的嵌套操作。内部类的结构看起来更为复杂,那为什么还要用内部类呢?原因有三:1:内部类可以访问外部类的属性,包括私有属性,而外部类也同样可以访问内部类的属性(包括私有属性);2 :内部类可以对同一包中的其他类隐藏起来;3 :内部类还可以解决java中的单继承局限;这就是内部类之所以存在的原因了。内部类与外部类的关...

2018-10-22 10:45:21 78

原创 java两个编程题

一、在一个字符串中找出最先出现三次的字符。思想:利用int型与char型可相互转化的思想,巧妙利用char型来做数组下标这样就不会出现重复咯。1.申请整形数组空间,由字符做数组下标,给相应数组值进行++;2.charAt(index);可将字符串中下标为index的字符取出;具体实现代码:public class Test{ public static void main(String[] ar...

2018-04-18 11:53:00 130

原创 用JAVA实现双向链表

interface Link{ void add(Object obj);//尾插 boolean remove(int index);//删除下标尾index的节点 boolean set(int index,Object obj);//将下标为index的节点的值改为obj Object get(int index);//获取下标为index的节点的data值 int contain...

2018-04-15 17:20:39 147

原创 linux下实现带颜色的进度条

废话不说,直接来结果图!下面就来给大家这个进度条的代码!好了,一个彩色进度条就做好了,颜色部分可以自己换哦!(顺便共享出颜色的链接)点击打开链接http://blog.csdn.net/bingoo_t/article/details/53222393...

2018-03-01 17:09:17 325

原创 用可变参数列表实现简单的printf函数

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<stdarg.h>void print_num(int n){ if (n > 9) print_num(n / 10); putchar(n % 10+'0');}void print(char* format, ...){

2017-12-30 16:06:28 150

原创 函数栈帧

在调用任何一个函数时,系统都会为其分配内存空间,便于它存储临时变量或者别的一些东西,下面我就来简单介绍一下函数在调用时它的内存情况。即函数栈帧。 以此段代码为例:(此例是在vs2013下实现的)int Add(int x, int y){ int sum = x + y; return sum;}int main(){ int x = 10; int y =

2017-12-21 08:37:19 208

原创 浅析可变参数列表

一般的函数在传参时只能传一个或两个甚至多个参数,但其前提是参数的个数必须是固定不变的。printf()函数和scanf()函数的参数却是可变的。在printf()函数中,它所传的参数是由标准化格式输出的类型决定。例:int main(){ printf("%s\n", "hello world"); printf("%s%s%c", "hello ", "worl", 'd')

2017-12-19 17:04:22 130

原创 c语言实现的三子棋游戏

game.h#ifndef __GAME_H__#define __GAME_H__#define ROW 3#define COL 3#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<windows.h>void init_board(char arr[ROW][COL], int

2017-12-12 19:47:24 360

原创 c语言实现的扫雷游戏

game.h#ifndef __GAME_H__#define __GAME_H__#include<stdio.h>#include<time.h>#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY 10void init_board(char arr[ROWS][COLS], int

2017-12-12 19:39:04 315

原创 浅析C语言操作符

先来说说C语言中都有哪些操作符。c语言中操作符包括:算数操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符,逗号操作符,小标引用,函数调用和结构成员。每种操作符都包含多个,下面就来分析分析吧!一.算数操作符:它包括+,-,*,/,%这五种。其中“/“和“%”这两种运算符比较特殊。当使用除法运算符时,如果”/“两边都是整形的,那么得到的结果则是整数,执行

2017-11-22 10:37:34 204

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除