暂时未有相关云产品技术能力~
10年Java开发经验,图书《漫画算法》作者,微信公众号【程序员小灰】运营者,全网粉丝超过100万,擅长Java语言和数据结构
实操教学|如何用Serveless3分钟做好邀请函?
我们有1000个苹果,要用10个箱子来进行分装,每个箱子所装的苹果数量不限。但是这里有一个特殊的要求:当我们想要任意数量(从1到1000)苹果的时候,只需要给出几个整箱就行了。
什么是IaaS、PaaS、SaaS?
笔者在最近的日常工作中,因业务需要,研究 Java 字节码层面的知识。具体是,需要根据类字节码,获取特定方法名的方法入参,此方法名在源码中只有一个。但是在实际使用中发现:在类实现泛型接口的情况下,在字节码层面,类却有两个同名方法,导致无法确定哪个方法才是我们需要的方法。经过研究发现,其中一个方法是编译器在编译的过程中,自动生成的桥接方法(bridge method),两个方法可通过特定标识区分。
今天的这篇漫画,改编自谷歌公司的一道著名面试题目。这道题目是一个数学问题,和编程关系不大,但是十分有趣有趣。小灰今天分享给大家。
对于我们程序员来说,数据结构和算法是必须要掌握的内功。网络上有很多人整理过编程学习的路线图,但是有关数据结构和算法的却并不多。
当我们实现一个比较复杂的数据结构,比如二叉树、图、跳表,Debug的时候怎么验证自己写的函数对不对呢? 一个方法是将数据结构可视化,与理论上的结果比较即可。
首先,我们来讲一讲什么是数据库。 作为程序员,我们写的大多数商业项目,往往都需要用到大量的数据。计算机的内存,可以实现数据的快速存储和访问。
使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合、反射、泛型、注解等等,这些可以说我们在平时开发中是经常使用到的,尤其是集合,基本是只要写代码没有用不到的,今天我们先来谈谈泛型。
Buffer Pool 是什么?从字面上看是缓存池的意思,没错,它其实也就是缓存池的意思。它是 MySQL 当中至关重要的一个组件,可以这么说,MySQL的所有的增删改的操作都是在 Buffer Pool 中执行的。
清楚键盘背后的原理吗?键盘上都标有各键的名称,表明了各键所代表的意义,但是计算机是如何知道的?组合键是怎样实现的?按下一个代表字符的键,怎么变成平常使用的ASCII码的? 看完本文,相信你就能了解键盘的本质,知晓这些问题答案。
中断,英文名为Interrupt,计算机的世界里处处都有中断,任何工作都离不开中断,可以说整个计算机系统就是由中断来驱动的。那么什么是中断?简单来说就是CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。
泛型(generics) 他是 JDK5 中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。
什么是 Spring AOP 现在进入正题,首先介绍什么是 Spring AOP。官方介绍是面向切面编程。首先这是一种编程思想,基于面向对象编程(OOP)的一种补充。面向对象编程思想是指万物皆对象。处理对象的过程叫方法,面向切面编程就是指把方法看成一个整体,在不改变方法原代码的情况下改变方法执行过程。
这一次,我们来重点讲解 wait(),notify(),notifyAll() 这三大方法。
getClass() getClass方法是干什么的呢?首先,getClass方法用于获取一个对象的运行时类(Class),进而通过返回的Class对象,获取该类的相关信息,比如获取该类的构造方法、该类有哪些方法、该类有哪些成员变量等信息。
首先我们需要知道如何哪些垃圾需要回收?判断对象是否需要回收有两种算法。一种是引用计数算法、一种是可达性分析算法。
许多前辈程序员经过长期实践,总结出了一系列的解决方案。这些解决方案可以提高代码的可读性,增加代码的可重用性,保证代码的可扩展性。 这一系列解决方案,被人们称为设计模式,它是面向对象编程当中的各种经典套路。 设计模式是一种抽象的编程思想,并不局限于某一特定的编程语言,而是在许多语言之间相通的。比如在Java、C#、C++语言当中,都可以使用到设计模式。
装饰器模式都包含哪些核心角色呢? 1. Component接口 2. ConcreteComponent类 3. Decorator抽象类 4. ConcreteDecorator类
在Java语言中,Object类实现了Cloneable接口,一个对象可以通过调用Clone()方法生成对象,这就是原型模式的典型应用。 但需要注意的是,clone()方法并不是Cloneable接口里的,而是Object类里的,Cloneable是一个标识接口,标识这个类的对象是可被拷贝的,如果没有实现Cloneable接口,却调用了clone()方法,就会报错。
首先,我们来定义一个Product类:接下来,我们定义抽象的Builder类:然后,是具体的Builder实现类:
在上面的代码中,代理类和业务类继承了相同的接口,并且重写了添加/删除学生的方法。 在重写的方法中,我们不仅可以调用业务类的原有方法,并且在调用的前后可以进行额外的处理,比如加上日志、事务等等。 这样一来,在客户端当中,我们只要创建了代理类,就可以像使用业务类一样使用它,非常方便:
Treap是什么? 顾名思义,Treap=Tree+Heap,树堆=树+堆 所以,Treap就一定是树和堆的结合体咯! 恭喜你,你已经掌握Treap的精髓了 那么Treap是怎样把树和堆的优点结合起来的呢?
为了避免树瘸腿,我们可以通过适当的旋转来调整树的结构。 伸展树的核心,是通过不断的将结点旋转到根结点(即为splay操作),来保证整棵树不会跟链表一样。它由 Daniel Sleator 和 Robert Tarjan 发明 。
先计算存储下来再求值,不失为一种好方法;但亦可以在计算 的同时判断 分解为 的幂(即转为 进制)后是否含 ,边计算边乘。 形式化地,对于 位,其代表的幂 为 ()。 这样,我们由低位向高位计算,每次将底数平方即可。 下面两份伪代码,分别对应这种方法的如上两种实现。
既然名字叫树状数组,那它必然是个数组,可外表下藏着二叉树的结构。 精巧的结构与lowbit密不可分,真是妙极了。 以下内容中,我们在这里管原始的数组叫做a,树状数组(经过处理)叫做bit,三个图中的数字均为下标,不是值!
质数(Prime number),又称素数,指在大于 的自然数中,除了 和该数自身外,无法被其他自然数整除的数(也可定义为只有 与该数本身两个正因数的数)。 如何快速判断某个数是否为质数?如何再给定区间内筛出所有的质数?
而所谓数据结构,是数据的组织、管理和存储格式。简单理解的话,数据结构就是执行算法的“原材料”。
所谓算法,指的是解决实际问题的一系列方法。 很多人以为,算法是一个新词汇,只和计算机有关系。 其实,算法的历史非常悠久,跟人类的生产生活有着密切的关系。
我们回到刚才的题目当中,假设背包的容量是10,有5个商品可供选择,每个商品的价值和重量如图所示。
如图中所示,我们把原本的冠军选手5排除掉,在四分之一决赛和他同一组的选手6就自然获得了直接晋级。 接下来的半决赛,选手7打败选手6晋级;在总决赛,选手7打败选手3晋级,成为了新的冠军。 因此我们可以判断出,选手7是总体上的亚军。
在上面这个链条当中,包含着不同的任务处理者。面对一个新任务,每个任务处理者需要判断自己能否处理该任务,如果能处理,则处理并返回;如果不能处理,则转交给下一个任务处理者,直到某一个任务处理者最终完成处理。这就是职责链模式的核心思想。
抽象工厂模式: 抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。
假设我们的业务代码当中,有一个被广泛引用的“口罩类”,这个类实例需要在许多地方被创建和初始化,而初始化的代码也比较复杂。
这里所谓的“套餐”,就是底层细粒度接口的不同组合。在保留底层接口不变的前提下,中间层为调用方提供了便利。 这正是外观模式(Facade Pattern)的设计思想: To make a complex subsystem easier to use, a simple interface should be provided for a set of interfaces in the subsystem. 为了使复杂的子系统更容易被使用,应当为子系统的众多接口提供一个简洁的高层接口。
场景1:游戏操作界面 场景2:游戏迷宫
1.创建型模式 这一类设计模式的目的是用于创建对象。 2.结构型模式 这一类设计模式的目的是优化不同类、对象、接口之间的结构关系。 3.行为型模式 这一类设计模式的目的是更好地实现类与类之间的交互以及算法的执行。
让我们来举个例子,给定如下数组:该数组对应的股票涨跌曲线如下:显然,从第2天价格为1的时候买入,从第5天价格为8的时候卖出,可以获得最大收益。
让我们来举个例子,给定如下数组:该数组对应的股票涨跌曲线如下:显然,从第2天价格为1的时候买入,从第5天价格为8的时候卖出,可以获得最大收益。
我们以下面这个链表为例:给定链表的头结点,但并不知道链表的实际长度,要求我们找到链表的倒数第n个结点。 假设n=3,那么要寻找的结点就是元素1:
我们来举个例子,给定下面这样一个整型数组(假定数组不存在重复元素):我们随意选择一个特定值,比如13,要求找出两数之和等于13的全部组合。 由于12+1 = 13,6+7 = 13,所以最终的输出结果(输出的是下标)如下:
什么意思呢?我们来举个例子,给定下面这样一个二维数组:我们需要从左上角的元素1开始,按照顺时针进行螺旋遍历,一直遍历完所有的元素,遍历的路径就像下图一样:经过这样的遍历,返回的元素结果如下:
如何进行二分查找呢? 首先根据数组下标,定位到数组的中间元素:由于要查找的元素20,大于中间元素12,再次定位到数组右半部分的中间元素:这一次定位到的元素正好是20,查找成功。
而在AVL树当中,我们通过“平衡因子”来判断一颗二叉树是否符合高度平衡。 到底什么是AVL树的平衡因子呢? 对于AVL树的每一个结点,平衡因子是它的左子树高度和右子树高度的差值。只有当二叉树所有结点的平衡因子都是-1, 0, 1这三个值的时候,这颗二叉树才是一颗合格的AVL树。
哈夫曼编码(Huffman Coding),同样是由麻省理工学院的哈夫曼博所发明,这种编码方式实现了两个重要目标: 1.任何一个字符编码,都不是其他字符编码的前缀。 2.信息编码的总长度最小。
二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。
二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。
哈夫曼树是由麻省理工学院的哈夫曼博士于1952年发明,这到底是一颗什么样的树呢? 刚才我们学习了树的带权路径长度(WPL),而哈夫曼树(Huffman Tree)是在叶子结点和权重确定的情况下,带权路径长度最小的二叉树,也被称为最优二叉树。 举个例子,给定权重分别为1,3,4,6,8的叶子结点,我们应当构建怎样的二叉树,才能保证其带权路径长度最小? 原则上,我们应该让权重小的叶子结点远离树根,权重大的叶子结点靠近树根。
KMP算法和BF算法的“开局”是一样的,同样是把主串和模式串的首位对齐,从左到右对逐个字符进行比较。
BF算法是如何工作的? 正如同它的全称BruteForce一样,BF算法使用简单粗暴的方式,对主串和模式串进行逐个字符的比较。