自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

谁D了我的BUG

Fighting!

  • 博客(170)
  • 收藏
  • 关注

原创 Go垃圾回收与实现

Go垃圾回收与实现为什么需要垃圾回收减少错误和复杂性像没有垃圾回收的语言,比如C、C++,需要手动分配,释放内存,容易出现内存泄露和野指针问题。具有垃圾回收功能的语言屏蔽了内存管理的复杂性。开发者可以更好的关注核心的业务逻辑,虽然垃圾回收不保证完全不产生内存泄露,但提供了重要的保障,即不在被引用的对象,终将被收集。解耦手动分配内存的问题在于难以在本地模块内做出全局的决定,具有垃圾回收功能的语言将垃圾收集工作托管给具有全局观的运行时代码,开发者编写的业务模块将真正实现解耦。经典的垃圾回收算

2022-03-31 10:10:12 1057

原创 你不会不知道ELF文件长什么样子吧

在上一篇中你知道Hello World背后发生了什么吗, 我们从向屏幕打印一个hello,World入手,看了一下整个的执行过程,发现一个简单的hello world,背后竟然藏着这么多的细节,以后,我们要将它的细节一步步呈现出来。我们在上一篇的最后中说到,要深入讲一下链接,链接是非常重要,它是我们的程序和操作系统关联起来的步骤,对于了解底层的运行原理也是必须的一步,说到链接,从字面上看上去是不是很像用个链条把一些东西串起来,既然想要链接,我们必须有材料,才能够进行链接,这里的材料就是目标文件,什么是目标

2022-01-04 09:06:57 454

原创 你知道Hello World背后发生了什么吗?

计算机的世界,就从hello,world开始吧!#include <stdio.h>int main(){ printf("Hello World\n"); return 0;}“Hello World”,对于好兄弟们来说,都很熟悉吧,大学第一课、编程语言书本的第一个dmeo,基本都是用这个作为引子,这次我们也从hello,world开始进入计算机的世界遨游吧!刚开始学这些东西的时候,比如用VC++, 都是鼠标点点,直接出来黑窗口,可以看到我们的执行结果,却不知,这一系列的背

2021-12-26 21:46:54 3039 13

原创 git底层原理

gitgit init:当执行git init的时候,会初始化代码仓库,在当前目录下面出现一个.git目录.git├── HEAD├── config├── description├── hooks├── info│   └── exclude├── objects│   ├── info│   └── pack└── refs├── heads└── tags8 directories, 17 files1. c

2021-10-17 18:48:35 228

原创 C语言概述

初识C语言C语言的起源C语言是在B语言的基础上进行设计的,初衷是将其作为程序员使用的一种编程工具,选择C语言的理由设计特性:自顶向下,结构化编程和模块化设计高效性:强大的控制结构,快速,代码紧凑程序更小,可移植到其他计算机可移植性:在一种系统中编写的C程序稍作修改或不修改就能再其他系统运行。强大而灵活:Unix操作系统大部分是用C语言写的,其它语言的许多编译器和解释器都是用C编写的面向程序员:程序员利用C可以访问硬件和操控内存中的位,利用丰富的运算符,让程序员简洁地表达式自己的意图缺点:

2020-11-12 20:39:51 129

原创 二十二:最小操作步骤数

题目假设s和m初始化, s = “a”; m = s;再定义两种操作, 第一种操作:m = s;s = s + s;第二种操作:s = s + m;求最小的操作步骤数, 可以将s拼接到长度等于n实现public class SplitNbySM { // 附加题:怎么判断一个数是不是质数? public static boolean isPrim(int n) { if (n < 2) { return false; } int max = (int) M

2020-07-03 09:09:34 296

原创 设计模式:观察者

定义与类型定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新类型:行为型适用场景关联行为场景,建立一套触发机制优点观察者和被观察者之间建立一个抽象的耦合观察者模式支持广播通信缺点观察者之间有过多的细节依赖,提高时间消耗及程序复杂度使用要得当,要避免循环调用Coding...

2020-06-21 08:24:38 129

原创 二十一:将正方形矩阵顺时针旋转90°

题目给定一个正方形矩阵, 只用有限几个变量, 实现矩阵中每个位置的数顺时针转动90度, 比如如下的矩阵0 1 2 34 5 6 78 9 10 1112 13 14 15矩阵应该被调整为:12 8 4 013 9 5 114 10 6 215 11 7 3实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in =

2020-06-08 15:38:54 284 1

原创 二十:顺时针打印矩阵

题目用螺旋的方式打印矩阵, 比如如下的矩阵0 1 2 34 5 6 78 9 10 11打印顺序为: 0 1 2 3 7 11 10 9 8 4 5 6实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt();

2020-06-08 14:36:39 103

原创 十九:“之”字形打印矩阵

题目用zigzag的方式打印矩阵, 比如如下的矩阵0 1 2 34 5 6 78 9 10 11打印顺序为: 0 1 4 8 5 2 3 6 9 10 7 11实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt();

2020-06-08 12:22:56 179

原创 设计模式:原型

定义与类型定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象特点:不需要知道任何创建的细节,不调用构造函数类型:创建型适用的场景类初始化消耗较多资源new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)构造函数比较复杂循环体中生产大量对象时优点原型模式性能上比直接new一个对象性能高简化创建过程缺点必须配备克隆方法对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入危险深拷贝、浅拷贝要运用得当扩展深克隆浅克隆...

2020-06-07 23:22:36 119

原创 十八:超级洗衣机

题目假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。实现class Solution { public int findMinMoves(int[] m

2020-06-07 07:20:44 307

原创 十七:1出现最多的行

题目给定一个二维数组,只含有连续的0或连续的1,如果同时含有0和1,0肯定在1的左边,也可以一行中,全是0或者全是1,返回含有1数量最多的行实现

2020-06-07 06:39:05 154

原创 十六:在行列都排好序的矩阵中找指定数

题目给定一个元素为非负整数的二维数组matrix, 每行和每列都是从小到大有序的。再给定一个非负整数aim, 请判断aim是否在matrix中。实现import java.util.ArrayList;import java.util.List;import java.util.Scanner;import java.util.Stack;public class Main { public static boolean find(int[][] m, int k) { in

2020-06-06 23:12:53 207

原创 十五:二叉树根节点到叶节点权值最大和

题目二叉树每个结点都有一个int型权值, 给定一棵二叉树, 要求计算出从根结点到叶结点的所有路径中, 权值和最大的值为多少。实现package com.jpg.coding;public class MaxSum { public static class Node { public int value; public Node left; public Node right; public Node(int value) { this.value = val

2020-06-06 22:53:14 2077

原创 十四:数字字符串转换为字母组合的种数

题目将给定的数转换为字符串, 原则如下: 1对应 a, 2对应b, ……26对应z, 例如12258可以转换为"abbeh", “aveh”, “abyh”, “lbeh” and “lyh”, 个数为5, 编写一个函数, 给出可以转换的不同字符串的个数。实现package com.jpg.coding;public class NumToStringWays { public static int convertWays(int num) { if (num < 1) {

2020-06-06 21:59:52 1071

原创 设计模式:单例

定义与类型定义:保证一个类仅有一个实例,并提供一个全局访问点类型:创建型适用场景想确保任何情况下都绝对只有一个实例优点在内存里只有一个实例,减少了内存开销可以避免对资源的多重占用设置全局访问点,严格控制访问缺点没有接口,扩展比较困难重点私有构造器线程安全延迟加载序列化和反序列安全反射(防止反射攻击)单例相关设计模式工厂模式享元模式Coding懒汉式的三种写法线程不安全 final class Singleton { private static

2020-06-06 16:05:16 130

原创 设计模式:建造者

定义与类型定义:将一个复杂对象的构建和它的表示分离,使同样的构建过程可以表示创建不同的表示用户只需指定需要建造的类型就可以得到它们,建造过程及细节不需要知道类型:创建型适用场景如果一个对象有非常复杂的内部结构(很多的属性)想把复杂对象的创建和使用分离优点封装性好,创建和使用分离扩展性好、建造类之间独立、一定程度上解耦缺点产生多余的builder对象产品内部发生变化,建造者都要修改,成本较大Coding和工厂模式区别:建造者模式注重于方法的调用顺序,工厂模式注重于创建产

2020-06-05 22:15:27 114

原创 设计模式:抽象工厂

定义与类型定义:抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口无须指定它们具体的类类型:创建型抽象工厂可以将一组具有同一主题单独的工厂封装起来,在使用中客户端程序需要创建抽象工厂的具体实现,使用抽象工厂作为接口,来创建这一个主题的对象适用场景客户端(应用层)不依赖于产品类实例如何被创建、实现等细节强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码提供了一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体的实现优点具体产品在应

2020-06-04 19:08:51 185

原创 十三:用一个栈实现另一个栈的排序

题目请编写一个程序, 对一个栈里的整型数据, 按升序进行排序(即排序前, 栈里的数据是无序的, 排序后最大元素位于栈顶) , 要求最多只能使用一个额外的栈存放临时数据, 但不得将元素复制到别的数据结构中。实现import java.util.Scanner;import java.util.Stack;public class Main { public static void test(Stack<Integer> stack) { Stack<Integer

2020-06-04 16:38:47 239

原创 十二:Magic操作

题目给一个包含n个整数元素的集合a, 一个包含m个整数元素的集合b。定义magic操作为, 从一个集合中取出一个元素, 放到另一个集合里, 且操作过后每个集合的平均值都大大于于操作前。注意以下两点:1) 不可以把一个集合的元素取空, 这样就没有平均值了2) 值为x的元素从集合b取出放入集合a, 但集合a中已经有值为x的元素, 则a的平均值不变(因为集合元素不会重复) , b的平均值可能会改变(因为x被取出了)问最多可以进行多少次magic操作?实现package com.jpg.c

2020-06-04 16:25:10 565

原创 十一:rand5到rand7及扩展

题目给定一个函数f, 可以1~5的数字等概率返回一个。 请加工出1~7的数字等概率返回一个的函数g。给定一个函数f, 可以a~b的数字等概率返回一个。 请加工出c~d的数字等概率返回一个的函数g。给定一个函数f, 以p概率返回0, 以1-p概率返回1。 请加工出等概率返回0和1的函数g实现package com.jpg.coding;public class Rand5ToRand7 { //已知的等概率返回1-5的函数 public static int f() { re

2020-06-04 15:26:29 193

原创 十:边界都是1的最大正方形大小

题目给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度、例如0 1 1 1 10 1 0 0 10 1 0 0 10 1 1 1 10 1 0 1 1其中,边框全是1的最大正方形的大小为4 \times 44×4,所以返回4[要求]时间复杂度为O(n^3)O(n3),空间复杂度为O(n^2)O(n2)实现import java.util.*;public class Main { public static

2020-06-04 12:06:08 235

原创 九:绳子覆盖的最大点数

题目给定一个有序数组arr, 代表数轴上从左到右有n个点arr[0]、 arr[1]…arr[n- 1],给定一个正数L, 代表一根长度为L的绳子, 求绳子最多能覆盖其中的几个点。实现package com.jpg.coding;public class CordCoverMaxPoint { //思路:让绳子的最右的端点依次压中数轴上的从左到右的点 //然后,根据绳子的长度和端点位置的差值value,通过在该点的左侧寻找大于等value最左的位置 //的点,然后通过下标变换就可以得

2020-06-04 11:14:50 791

原创 八:括号字符串最长有效长度

题目给定一个括号字符串str,返回最长的能够完全正确匹配括号字符字串的长度。实现import java.util.*;public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String str = in.next(); System.out.println(maxLength(str)); }

2020-06-04 10:39:01 964

原创 设计模式:工厂方法

定义与类型定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化那个类,工厂方法让类的实例化推迟到子类中进行类型:创建型适用场景创建对象需要大量重复的代码客户端(应用层)不依赖于产品类实例如何被创建、实现等细节一个类通过其子类来指定创建那个对象(利用面向对象的多态性和里氏替换原则)优点用户只需要关心所需产品对应的工厂,无需关心创建细节加入新产品符合开闭原则,提高可扩展性缺点类的个数容易过多,增加复杂度增加了系统的抽象性和理解难度...

2020-06-02 22:51:40 92 1

原创 七:差值为k的去重数字对

题目给定一个数组arr, 求差值为k的去重数字对。实现package com.jpg.coding;import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.List;public class SubValueEqualK { public static List<List<Integer>> allPair(int[] arr,

2020-06-02 17:59:59 238

原创 六:括号匹配深度

题目一个合法的括号匹配序列有以下定义:1、空串"“是一个合法的括号匹配序列2、如果"X"和"Y"都是合法的括号匹配序列,“XY"也是一个合法的括号匹配序列3、如果"X"是一个合法的括号匹配序列,那么”(X)“也是一个合法的括号匹配序列4、每个合法的括号序列都可以由以上规则生成。例如: “”,”()”,"()()","((()))“都是合法的括号序列对于一个合法的括号序列我们又有以下定义它的深度:1、空串”“的深度是02、如果字符串"X"的深度是x,字符串"Y"的深度是y,那么字符串"XY

2020-06-02 17:18:49 334

原创 五:缺失的括号

题目一个完整的括号字符串定义规则如下:1、空字符串是完整的。2、如果s是完整的字符串,那么(s)也是完整的。3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。例如,"(()())", ““和”(())()“是完整的括号字符串,”())(”, “()(” 和 ")"是不完整的括号字符串。牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的括号字符串。请问牛牛至少需要添加多少个括号。实现import java.util.*;public c

2020-06-02 16:18:30 319

原创 四:二叉树结构种数

题目给定一个非负整数n, 代表二叉树的节点个数。 返回能形成多少种不同的二叉树结构实现package com.jpg.coding;public class NumTree { /* * 递归版本的写法: * 共有n个节点 * 左子树0个,右子树n - 1个 * 左子树1个,右子树n - 2个 * 左子树2个,右子树n - 3个 * ... */ public static int process(int n) { if (n < 0) { ret

2020-06-02 12:08:20 268

原创 三:红和绿

题目牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。如样例所示: s = RGRGR我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。实现import java.util.*; public class Main { public static vo

2020-06-02 06:21:55 255 1

原创 设计模式:简单工厂

定义与类型定义:由一个工厂对象决定创建出哪一种“产品”类型类型:创建型,但不属于GOF23种设计模式适用场景工厂类负责创建的对象比较少客户端(应用层)只知道传入工厂类的参数,对于如何创建对象逻辑并不关心优点只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节缺点工厂类的职责相对过重,增加新的产品,需要修改工厂类的判断逻辑,违背开闭原则无法形成基于继承的等级结构Coding对于GOF23中设计模式中,带工厂的只有抽象工厂和工厂方法两种模式package c

2020-06-01 23:01:36 103

原创 二:青草游戏

题目牛牛和羊羊都很喜欢青草。 今天他们决定玩青草游戏。最初有一个装有n份青草的箱子,牛牛和羊羊依次进行,牛牛先开始。 在每个回合中,每个玩家必须吃一些箱子中的青草,所吃的青草份数必须是4的x次幂,比如1,4,16,64等等。不能在箱子中吃到有效份数青草的玩家落败。 假定牛牛和羊羊都是按照最佳方法进行游戏,请输出胜利者的名字。实现package com.jpg.coding;public class Eat { public static String winner1(int n) {

2020-06-01 12:20:32 14089

原创 一:买苹果

题目小虎去附近的商店买苹果, 奸诈的商贩使用了捆绑交易, 只提供6个每袋和8个每袋的包装包装不可拆分。 可是小虎现在只想购买恰好n个苹果, 小虎想购买尽量少的袋数方便携带。 如果不能购买恰好n个苹果, 小虎将不会购买。 输入一个整数n, 表示小虎想购买的个苹果, 返回最小使用多少袋子。 如果无论如何都不能正好装下, 返回-1。实现package com.jpg.coding;/* * 因为只有8个类型和6个类型的袋子,所以只有当苹果的个数是偶数个的时候,才能将所有的苹果的都装下 * 如

2020-06-01 09:34:20 351

原创 JVM---内存结构

程序计数器Program Counter Register是记住下一条JVM指令的执行地址特点是线程私有的不会存在内存溢出虚拟机栈每个线程运行所需要的内存,成为虚拟机栈每一个栈是由多个栈帧组成,栈帧是每个方法运行时需要的内存,一个栈帧对应着一个方法调用每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法垃圾回收是否涉及栈内存?不会,栈内存是一次次的方法调用产生的栈帧内...

2019-12-15 21:59:41 107

原创 Spring IoC控制反转

创建Spring项目的步骤1.新建 java project2.导入jar:必须的jar:1)spring的核心:spring-beans.jar,spring-core.jar,spring-context.jar,spring-expression.jar2)日志:commons-logging.jar可选的:1)日志的实现:log4j.jar2)单元测试:junit.jar...

2019-12-15 19:11:16 94

原创 191130技术周报

今天学习了JVM的体系结构以及堆的体系的结构的一部分首先,来说一下JVM的体系结构JVM的主要的空间分为方法区,堆区,虚拟机栈,本地方法栈,程序计数器其中方法区和堆区是共享的,虚拟机栈、本地方法栈和程序计数器是属于线程私有的,这是主要的运行时数据区域接下来说一下类加载器,类加载器的作用就是将.class文件加载到内存的方法区,并且初始化为可以运行的数据结构,类加载器犹如一个快递员,从现实来...

2019-11-30 23:45:22 101

原创 JVM

Java7堆在逻辑上的分为新生代 + 老年代 + 永久区Java8堆在逻辑上分为新生代 + 老年代 + 元空间堆在物理上分为新生代 和 老年代当new一个对象时,是new在新生代的伊甸区...

2019-11-30 23:02:36 98

原创 Java并发编程

随笔当.start()时并没有立刻启动线程,而是转为就绪状态,等待cpu调度多线程的状态:NEW:新建RUNNABLE:就绪BLOCKED:阻塞,sleep()和wait()会导致阻塞,两者区别:功能都是当前线程暂停,wait是放开手去睡,放开手里的锁,sleep握紧手去睡,醒了手里还有锁WAITING:不见不散(死死的等)TIEDWAITING:过时不候(等一定时间就等了)TER...

2019-11-20 13:29:30 108

原创 一个c函数到系统内核的执行过程

将printf函数通过库函数展开成为1个含有int 0x80代码的函数,然后执行80号中断,需要去IDT表中寻找中断程序的入口,为了可以进入IDT表,在执行80号中断的那一刻,将DPL设置为3,然后根据IDT表设置新的cs和ip,将cs设置成为8此时代表将cpl设置成0跳到system_call执行80号中断,进入内核态,在内核态执行完以后,重新将cpl设置成3,进入用户态...

2019-10-15 11:36:53 187

空空如也

空空如也

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

TA关注的人

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