最近学习了极客时间的《数据结构与算法之美》很有收获,记录总结一下。
欢迎学习老师的专栏:数据结构与算法之美
代码地址:http://github.com/peiniwan/Arithmetic
冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。归并排序和快速排序的时间复杂度为 O(nlogn) 。这两种排序算法适合大规模的数据排序
稳定,但是,归并排序并没有像快排那样,应用广泛,这是为什么呢?因为它有一个致命的“弱点”,那就是归并排序不是原地排序算法。
这是因为归并排序的合并函数,在合并两个有序数组为一个有序数组时,需要借助额外的存储空间。
归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题,比如:如何在 O(n) 的时间复杂度内查找一个无序数组中的第 K 大元素?
如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。
归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
分治思想跟我们前面讲的递归思想很像。是的,分治算法一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突。
写递归代码的技巧就是,分析得出递推公式,然后找到终止条件,最后将递推公式翻译成递归代码。所以,要想写出归并排序的代码,我们先写出归并排序的递推公式。
递推公式:
merge_sort(p…r) = merge(merge_sort(p…q), merge_sort(q+1…r))
终止条件:
p >= r 不用再继续分解
merge_sort(p…r) 表示,给下标从 p 到 r 之间的数组排序。我们将这个排序问题转化为了两个子问题,merge_sort(p…q) 和 merge_sort(q+1…r),其中下标 q 等于 p 和 r 的中间位置,也就是 (p+r)/2。当下标从 p 到 q 和从 q+1 到 r 这两个子数组都排好序之后,我们再将两个有序的子数组合并在一起,这样下标从 p 到 r 之间的数据就也排好序了。
public class MergeSort {
public void mergeSort(int[] a, int left, int right) {
if (left < right) {
int middle = (left + right) / 2;
mergeSort(a, left, middle);//左边归并排序,使得左子序列有序
mergeSort(a, middle + 1, right);//右边归并排序,使得右子序列有序
merge(a, left, middle, right);//将两个有序子数组合并操作
}
}
private void merge(int[] a, int left, int middle, int right) {//left0,mid0,right1
//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
int[] tmpArray = new int[a.length];
int rightStart = middle + 1;//右序列指针
int leftStart = left;//左序列指针
int temp = left;//临时数组指针
//比较两个小数组相应下标位置的数组大小,小的先放进新数组
while (left <= middle && rightStart <= right) {
if (a[left] <= a[rightStart]) {
//相当于tmpArray[third]=a[left];third++;left++三步合一步
tmpArray[temp++] = a[left++];
} else {
tmpArray[temp++] = a[rightStart++];
}
}
//如果左边还有数据需要拷贝,把左边数组剩下的拷贝到新数组
while (left <= middle) {
tmpArray[temp++] = a[left++];
}
//如果右边还有数据......
while (rightStart <= right) {
tmpArray[temp++] = a[rightStart++];
}
//将temp中的元素全部拷贝到原数组中
while (leftStart <= right) {
a[leftStart] = tmpArray[leftStart++];
}
}
public static void main(String[] args) {
MergeSort mergeSort = new MergeSort();
int[] a = new int[]{9, 7, 6, 5, 4, 3, 2, 1};
mergeSort.mergeSort(a, 0, a.length - 1);
for (int n : a) {
System.out.print(" " + n);
}
}
}
快排是一种原地、不稳定的排序算法。
快排利用的也是分治思想。乍看起来,它有点像归并排序,但是思路其实完全不一样。我们待会会讲两者的区别。现在,我们先来看下快排的核心思想。
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。利用分治法可将快速排序的分为三步:
快速排序和归并排序对比
归并排序的处理过程是由下到上的,先处理子问题,然后再合并。而快排正好相反,它的处理过程是由上到下的,先分区,然后再处理子问题。归并排序虽然是稳定的、时间复杂度为 O(nlogn) 的排序算法,但是它是非原地排序算法。我们前面讲过,归并之所以是非原地排序算法,主要原因是合并函数无法在原地执行。快速排序通过设计巧妙的原地分区函数,可以实现原地排序,解决了归并排序占用太多内存的问题。
public class QuickSort {
public void quick(int[] a) {
if (a.length > 0) {
quickSort(a, 0, a.length - 1);
}
}
/**
* 快速排序
* @param a
* @param low 低位
* @param high 高位
*/
private void quickSort(int[] a, int low, int high) {
if (low < high) {
int middle = getMiddle(a, low, high);
//递归排比第一个基数小的数和大的数
quickSort(a, 0, middle - 1);
quickSort(a, middle + 1, high);
}
}
/**
*
* @param a
* @param low
* @param high
* @return
*/
private int getMiddle(int[] a, int low, int high) {
int temp = a[low];//基准元素
while (low < high) {//第二次3,9
while (low < high && a[high] >= temp) {
high--;
}
a[low] = a[high];//将比基数小的数放到基数前面///用个数字想一下就明白了
while (low < high && a[low] <= temp) {
low++;
}
a[high] = a[low];//将比基数大的数放到基数后面
}
a[low] = temp;//插入到排序后正确的位置,low就是基数应该在的位置
return low;
}
}
快排核心思想就是分治和分区,我们可以利用分区的思想,来解答开篇的问题:O(n) 时间复杂度内求无序数组中的第 K 大元素。比如,4, 2, 5, 12, 3 这样一组数据,第 3 大元素就是 4。
我们选择数组区间 A[0…n-1] 的最后一个元素 A[n-1] 作为 pivot,对数组 A[0…n-1] 原地分区,这样数组就分成了三部分,A[0…p-1]、A[p]、A[p+1…n-1]。
如果 p+1=K,那 A[p] 就是要求解的元素;如果 K>p+1, 说明第 K 大元素出现在 A[p+1…n-1] 区间,我们再按照上面的思路递归地在 A[p+1…n-1] 这个区间内查找。同理,如果 K<p+1,那我们就在 A[0…p-1] 区间查找。
int kthLargest = leetCode.findKthLargest(new int[]{4, 2, 5, 12, 3}, 3);
//倒数
class Solution {
public int findKthLargest(int[] nums, int k) {
int len = nums.length;
int left = 0, right = len - 1;
int pivot = 0;
while (len - k != (pivot = partition(nums, left, right))) {
//4所在的问题就是2,那就找到了
//第k大应该在第K位,找每个数字应该在的位置,正好第0个4就是第K位,就找到了
if (pivot < len - k) {//在后面
left = pivot + 1;
right = len - 1;
} else {
left = 0;
right = pivot - 1;
}
}
return nums[pivot];
}
private int partition(int[] nums, int left, int right) {
int pivot = nums[left];
while (left < right) {
while (left < right && nums[right] >= pivot)
right--;
nums[left] = nums[right];
while (left < right && nums[left] <= pivot)
left++;
nums[right] = nums[left];
}
nums[left] = pivot;
return left;
}
}
为什么上述解决思路的时间复杂度是 O(n)?
第一次分区查找,我们需要对大小为 n 的数组执行分区操作,需要遍历 n 个元素。第二次分区查找,我们只需要对大小为 n/2 的数组执行分区操作,需要遍历 n/2 个元素。依次类推,分区遍历元素的个数分别为、n/2、n/4、n/8、n/16.……直到区间缩小为 1。
如果我们把每次分区遍历的元素个数加起来,就是:n+n/2+n/4+n/8+…+1。这是一个等比数列求和,最后的和等于 2n-1。所以,上述解决思路的时间复杂度就为 O(n)。
顾名思义,PathMeasure是一个用来测量Path的类,主要有以下方法: 构造方法方法名释义PathMeasure()创建一个空的PathMeasurePathMeasure(Pathpath,booleanforceClosed)创建PathMeasure并关联一个指定的Path(Path需要已经创建完成)。公共方法返回值方法名释义voidsetPath(Pathpath,booleanforceClosed)关联一个PathbooleanisClosed()是否闭合floatgetLength()获取Path的长度booleannextContour()跳转到下一个轮廓booleangetSegment(floatstartD,floatstopD,Pathdst,booleanstartWithMoveTo)截取片段booleangetPosTan(floatdistance,float[]pos,float[]tan)获取指定长度的位置坐标及该点切线值booleangetMatrix(floatdistance,Matrixmatrix,intflags)获取指定长度的位置
大家普遍的痛点,都觉得数据分析的前80%的工作都花费在了数据整理上了,其中一个直接的原因就是,几乎所有人,都在加班加点,努力为他人制造这个麻烦。虽然出发点是为了完成自己的报告,想把数据呈现的更加美观和漂亮,再漂亮些,或者基于老板们的要求,把最后的报告整理成老板们希望看到的样子。而所有这一切,最后都成为你想要抱怨的对象。 在开启数据分析之旅前,必须要搞清楚的几个基本概念,及其之间的区别。了解了这些以后,至少你会少制造一些麻烦(你所认为的亮点)出来。工作表与数据源(表)的区别需要先澄清一个概念,就是Excel里sheet和table的区别。这也可能是很多早期的Excel书籍或培训老师,带来的误解,大家普遍的理解是把sheet就是表,就连官方的翻译都是把sheet直接译为“工作表"。然而此表非彼表。这都是中英文翻译的歧义埋的坑,还是先来看下他们的英文直译 sheet table 这样是不是清楚一些了,基于大家的习惯,还是把sheet称为工作表,那工作表就是提供给我们的一个工作区域,可以随意在上面输入数据,做表格,画简图等等,反正你喜欢就好。table才是真正的表格,称其为数据表。数
CentOS7ROOT密码的重置方式和CentOS6完全不一样,以进入单用户模式修改ROOT密码为例。 系统环境:CentOS7.4 1、重启系统,按esc2、按e,出现如下界面3、编辑修改两处:ro改为rw,在LANG=en_US.UFT-8后面添加init=/bin/sh4、按Ctrl+X重启,出现以下界面5、修改密码6、然后更新系统信息,如果selinux属于关闭状态则不需要执行这条命令。 touch /.autorelabel (执行命令touch/.autorelabel ,在/下创建一个.autorelabel文件,有这个文件存在,系统在重启时就会对整个文件系统进行relabeling重新标记,也可以理解为对文件进行底层权限的控制和标记) 7、重启系统 执行命令:reboot-f如果reboot时出现Failedtotalktoinitdaemon 解决方法:reboot–f 8、进入系统CentOS6.9重置ROOT密码 1、重启系统,按esc,出现如下界面2、按e,出现如下界面3、选择第二项-->kernel,继续按e4、在rhgbquiet后输入single或
eetcodeexplore初级算法第八题。原题链接:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/28/题目分析原题内容如下:Givenanarraynums,writeafunctiontomoveall0'stotheendofitwhilemaintainingtherelativeorderofthenon-zeroelements. Example: Input:[0,1,0,3,12] Output:[1,3,12,0,0] Note: Youmustdothisin-placewithoutmakingacopyofthearray. Minimizethetotalnumberofoperations.复制题意拆解:1、输入为一个列表,这个列表只包含数字。 2、将所有的0提前,而其他数字要维持原有的顺序。注意事项: 1、原地修改(注意:in-place这个单词,经常在题目中会看到),即不能申明其他list、dict类型。 2、尽量少
之前的文章一图入门Matplotlib绘图中我们学习了matplotlib中常见图表元素的绘制方法,所有操作都通过可以调用plt的函数实现。本节继续来学习使用matplotlib中生成各种常见的统计图表。后台回复“统计图一”可以获取本文全部代码。柱形图matplotlib中使用bar函数绘制柱形图。如果遇到中文无法显示的问题,可以参考本次推送的次条文章。参数含义如下:说明两点。一是上面代码中我们用plt.text为柱体添加了文字标签。ha和va是horizontalalignment和verticalalignment的缩写,分别表示水平对齐和垂直对齐,其他参数可以参见下面的链接:https://matplotlib.org/api/text_api.html#matplotlib.text.Text。二是关于x传入字符串列表参数替代tick_label。参见下面代码,注意x的值和前面代码的差别,实现的效果是一样的。水平方向柱形图水平方向柱形图对应的函数是barh,参数和bar是类似的。上面的图改成水平方向的效果如下:barh的第一个参数是y轴上标签的位置(或者值),第二个参数是我们要
作者:晓查发自凹非寺转载自:量子位(QbitAI),未经允许不得二次转载关于PyTorch和TensorFlow谁更好的争论,从来就没有停止过。开源社区的支持度、上手的难易度都是重要的参考。还有人说:学术界用PyTorch,工业界用TensorFlow。然而还有一项不可忽略的因素,就是二者的实际性能。没关系,不服跑个分?!最近,一位来自“Huggingface”的工程师,使用了NLP中的Transformer模型,分别在两大平台上测试了一组推理速度。虽然Huggingface只是一家创业公司,但是在NLP领域有着不小的声誉,他们在GitHub上开源的项目,只需一个API就能调用27个NLP模型广受好评,已经收获1.5万星。PyTorch和TensorFlow究竟哪个更快?下面用详细评测的数据告诉你。运行环境作者在PyTorch1.3.0、TenserFlow2.0上分别对CPU和GPU的推理性能进行了测试。两种不同的环境中具体硬件配置如下:CPU推理:使用谷歌云平台上的n1-standard-32硬件,即32个vCPU、120GB内存,CPU型号为2.3GHz的英特尔至强处理器。GPU
编者按:连着专访了好几家VR厂商,给大家介绍了好几款优质VR游戏,谈了许多关于VR内容的方面的话题,VRPinea打算这次给大家来点不一样的。本期的专访对象是一家专业从事AR眼镜整体软硬件开发初创公司——影创科技,其员工分别来自于国内外从事光学、智能硬件、系统软件及图像开发的顶级公司,产品涵盖AR眼镜、单目AR眼镜、手机厂商定制化VR头显及AR+VR一体式头显。让我们跟随VRPinea,和影创科技的商务VP刘文涛一起来聊聊关于AR,关于硬件研发的那点事儿。影创科技团队自2014年组建后,一直致力于AR硬件和内容平台的开发。2015年底,影创科技研发出的双目智能AR眼镜原型机,引起业界的广泛关注。今年七月初,影创科技在北京国际会议中心召开2016夏季新品发布会,会上连发四款差异化AR/VR新品,分别为兼容AR和VR功能的一体式头显Halo、影创Air双目AR眼镜、AirNano单眼智能眼镜以及AirVR(移动VR)。 影创科技商务VP刘文涛八月初,影创科技从百余家申报的AR/VR企业中脱颖而出,成功入驻微软加速器。而就在前不久,其继影创Air、影创Nano、影创Halo及AirVR后的又
作图思路:准备一块300*300小单元格组成的区域,对照地图图形,在每个省图形范围内的单元格填入该省的数据,然后对这些单元格应用条件格式->色阶,就形成了一幅热力地图。这一做法参考了JorgeCamoes的帖子http://t.cn/zTDvGNb。不过本帖对其继续改进,利用条件格式设置单元格的边框线,来绘制省界线条,避免了地图图形的线条与单元格之间吻合精度不够的问题,使地图更整洁干净。作图步骤:1、在MapCells工作表中准备约300*300个单元格区域,设置行高列宽,使单元格呈小正方形。把这个区域定义名称为MapCells,便于后续选中设置。2、在这个区域上放置一个透明的中国地图轮廓图形。《用地图说话》范例包中提供了这样的素材,复制粘贴过来,调整大小,设置无填充色即可。3、依据地图图形,在每个省图形框住的格子里,填写公式,查找引用该省的指标值。以新疆为例,新疆的图形框住的单元格,其公式均填写为:=VLOOKUP(“新疆”,mydata,2,0)其中mydata是在Data表中放置的省名+指标数据。如下图所示。这一步是本做法的主要步骤。由于格子数有约300*300个之多,这显
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 ?个人主页:小嗷犬的博客 ?个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 ?本文内容:C/C++的三种入门排序方法 更多内容请见? C/C++中的基础数据类型C与C++的最常用输入输出方式对比C/C++中的素数判定本文目录冒泡排序1.什么是冒泡排序2.动图演示3.C/C++代码实现插入排序1.什么是插入排序2.动图演示3.C/C++代码实现选择排序1.什么是选择排序2.动图演示3.C/C++代码实现冒泡排序1.什么是冒泡排序冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 (来自百度百科:https://baik
原文地址:http://piotrgankiewicz.com/2017/04/17/asp-net-core-12-samples/ 作者:PiotrGankiewicz 翻译:杨晓东(Savorboard) 前言 在今天的博客中,我将介绍十几个可以在ASP.NETCore应用程序中使用的简单示例。从最简单的东西开始,比如Options,中间件,数据库,甚至Nginx或者Docker。 首先确定你已经执行过了dotnetrestore,然后运行dotnetrun来启动应用程序,如果该示例正在使用比如像数据库这样的外部资源的话,请确保你已经安装并且运行它。 #1.Options 我们先看一下options来热个身,你可以很轻松的创建一个被叫做XyzOptions的类并且将其绑定到appsettings.json文件,来做一个配置的定义,并且通过注入IOptions来使用它的实例。 #2.中间件 你可以通过将自己的中间件填加到整个流程中来扩展Http请求管道。如果你曾经使用过像NodeJS这样的框架,并且想要使用自己的代码来验证或者处理传入的请求,那么你也可以在ASP.NETCor
The last_epoch parameterisusedwhenresumingtrainingandyouwanttostarttheschedulerwhereitleftoffearlier.Itsvalueisincreasedeverytimeyoucall .step() ofscheduler.Thedefaultvalueof-1indicatesthattheschedulerisstartedfromthebeginning. Fromthedocs: Sincestep()shouldbeinvokedaftereachbatchinsteadofaftereachepoch,thisnumberrepresentsthetotalnumberofbatchescomputed,notthetotalnumberofepochscomputed.Whenlast_epoch=-1,thescheduleisstartedfromthebeginning. Forexample, >>>importt
http://community.topcoder.com/stat?c=problem_statement&pm=13455&rd=16077 这道题目很容易往贪心的方向思考。其实很难找到一个贪心策略正确的求出最少的>=K的顾客数目。 考虑到答案是求顾客的数目,而这个数目的范围是[0,n),并且n并不是很大。所以可以在解空间进行二分搜索。每次假定一个解x个顾客>=k。 当进行这样的假定时,就只需要检查在x个>k的顾客购买了最大可能的物品之后,余下的物品是否能够被余下的顾客数目在满足每个顾客<k的情况下被满足。 x个顾客>k时,我们可以用贪心法假定每个顾客都买了最多数目的物品,把这些物品从s[]中减去后,得到一个新数组。 于是现在的问题就是n-x个顾客,能否在每个顾客都购买<k个物品的情况下,得到s'[]所描述的评价。 简单的分析后,发现只要满足两个条件: 1)(n-x)>=max{s'[i]}最大数量的那个物品能够被指派给顾客。 2)(n-x)*(k-1)>=sum(s'[i]),可以通过组合使得每个顾客的指派都指派到没
我们宣布,10款全新的优化版虚拟机今天正式面市。这款名为“F系列”的全新虚拟机,基于因特尔2.4千兆赫Xeon®E5-2673v3(Haswell)处理器;采用因特尔睿频加速(TurboBoost)2.0技术,时钟速率高达3.1千兆赫。它与Dv2系列虚拟机的CPU性能相同,每个CPU内核有2GB的内存,单位小时内价格较低。基于此,用每内核的Azure计算单元(ACU)除以F系列价格可看出,F系列新款虚拟机在Azure上最具价格优势。有关ACU更多详情请参阅此处。 F系列虚拟机是游戏服务器、网络服务器和批处理的最佳选择。对于无需大量内存或单位CPU内核的本地SSD,其负载都会从F系列虚拟机中受益。F系列虚拟机尺寸自1CPU内核到16CPU内核不等,用户既可选择标准优化存储尺寸,也可选择高级优化存储尺寸。 F系列标准优化存储尺寸 F系列高级优化存储尺寸 注意:上表中1GB=1024^3字节 虚拟机尺寸的命名 F系列虚拟机尺寸的命名引入了对Azure虚拟机尺寸命名的新标准。对于此系列和未来发布的其他系列的虚拟机尺寸,主名称字母后的数值与CPU内核相匹配。诸如优化高级存储等其
ADT-BundleforWindows是由GoogleAndroid官方提供的集成式IDE,已经包含了Eclipse,你无需再去下载Eclipse,并且里面已集成了插件,它解决了大部分新手通过eclipse来配置Android开发环境的复杂问题。 有了ADT-Bundle,新涉足安卓开发的同学也无需再像以前那样在网上参考繁琐的配置教程,可以轻松一步到位进行Android应用开发。 第一步:JAVASDK(JDK)的安装: 可以去问百度下载JDK,也可以到官方下载JDK。 官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 第二步:下载ADT-BundleforWindows 官方下载地址:http://developer.android.com/sdk/index.html 第三步:安装ADT-Bundle 直接把下载下来的的adt-bundle-windows-xxx-xxx.zip,解压到你需要安装的位置。 第四步:安装Androi
一周IT新闻速览 福布斯中国发布2021年最佳CEO榜:雷军位列第一 据福布斯中文网消息,50位上榜的CEO的平均年龄近54岁,其中女性CEO有5位。与去年相比,互联网行业CEO入选人数下降。分行业来看,CEO所在企业与西药相关的有2位、医疗保健设备与用品相关的2位、疫苗相关生物科技公司有4位、医药服务公司有2位上榜,大健康领域共计10位,占比最高达到了20%。 B站就机房服务器故障道歉现在服务已经陆续恢复正常 昨晚,B站崩了登上热搜,全端开始无法访问,随后,A站、豆瓣等网站也出现访问故障。今日凌晨,B站发布公告称,昨晚,B站的部分服务器机房发生故障,造成无法访问。技术团队随即进行了问题排查和修复,现在服务已经陆续恢复正常。而针对网友传言的B站大楼失火一事,上海消防官博进行了辟谣,B站大楼并未出现火情。 字节跳动、美团优选宣布取消大小周 字节跳动近日宣布自8月1日起正式取消大小周。字节跳动发布全员邮件称,将于2021年8月1日起取消隔周周日工作的安排。8月开始有需求的团队和个人,可以通过系统提交加班申请。美团旗下社区团购业务“美团优选”也于近日发布通知,取消“大小周”(即隔周单休),
1.基本类型和引用类型 动态的属性:引用类型,为其添加属性和方法。 复制变量值: 基本类型:变量对象上创建一个新值,然后把值复制在新分配的空间上。 引用类型:复制的是对象的内存 传递参数:给函数传递时,参数只能按值传递 检测类型 检测基本数据类型:typeof 检测引用类型:instanceof 执行环境和作用域 当一个代码在环境中执行时,会创建变量对象的一个作用域链。 作用域链:保证执行环境有权访问所有的变量和函数的有效访问。 标识符解析是沿着作用域链一级一级查找标识符的过程。 延长作用域链 try-catch的catch:本质根据不同的判断,将变量传入函数体的内部,能访问到的函数增多,作用域延长。 with语句 没有块级作用域 本质:花括号中定义var变量,会添加到当前的执行环境。 垃圾收集 标记清除和引用计数 &n
什么是函数式接口呢,简单的来说就是一个接口,其中只有一个没有被实现的方法,即SAM(SingleAbstractMethod)类型接口。这样的接口在过去的时候,需要用类去实现其中的抽象方法,或者类似于监听器那样,用匿名内部类的方式去实现。现在可以通过lambda表达式的形式来实现相关功能,方式十分简便。接下来我们来写一个典型的SAM 1@FunctionalInterface 2publicinterfaceTestFunctionInterface{ 3 4voidmethod(); 5 6publicstaticvoidmain(String[]args){ 7TestFunctionInterfacetest=()->System.out.println("testmethod"); 8test.method(); 9} 10}复制 现在我们看这个interface和以前的相比有几个不同之处,第一个是里面有了有了static方法,第二个是多了一个@FunctionalInterface。我们首先说第一个,在java8以后,接口中可以定义方法,但是方法必须被static,
1463 找朋友 基准时间限制:1.5 秒空间限制:262144 KB分值: 80 难度:5级算法题 给定: 两个长度为n的数列A、B 一个有m个元素的集合K 询问Q次 每次询问[l,r],输出区间内满足|Bi-Bj|∈K 的最大Ai+Aj 数据约定: n,Q<=100000 m<=10 0<=A[i]<=1000000000 1<=B[i]<=n 1<=K[i]<=n 保证B[i]互不相等 Input n Q m A1 A2 ....An B1 B2 ....Bn K1 K2 ....Km l1 r1 l2 r2 . . lQ rQ复制 Output Q行,每行一个整数表示相对应的答案。 如果找不到这样的两个数则输出0。复制 Input示例 4 2 2 1 2 3 4 3&nb
今天学习了相关的数据库操作以及页面的跳转实验了一下再界面上简单的输出一下所求的数据,为下一步整合数据进行相关操作做铺垫: 相关的数据库表的设计目前只涉及三个表 分别是:用户信息表、配置表、收支明细表 publicvoidonCreate(SQLiteDatabasedb){ //usertable db.execSQL("createtableifnotexistsuser_tb(_idintegerprimarykeyautoincrement,"+ "userIDtextnotnull,"+ "pwdtextnotnull)"); //Configurationtable db.execSQL("createtableifnotexistsrefCode_tb(_idintegerprimarykeyautoincrement,"+ "CodeTypetextnotnull,"+ "CodeIDtextnotnull,"+ "CodeNametextnull)"); //costDetail_tb db.execSQL("createtableifnotexist
1、双亲委派机制 1.1定义 当一个类加载器收到了类加载的请求的时候,他不会直接去加载指定的类,而是把这个请求委托给自己的父加载器去加载。 如果父类为空,交给bootstrapclassloader加载。 如果类还是无法被加载到,则触发findclass,抛出classNotFoundException(findclass这个方法当前只有一个语句,就是抛出classNotFoundException),如果想自己实现类加载器的话,可以继承classLoader后重写findclass方法,加载对应的类) 1.2优点 避免类的重复加载保护程序安全,防止核心API被随意篡改 2、SPI(serviceproviderinterface)定义: SPI是jdk内置的一种服务提供发现机制。可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,常用的关系型数据有Mysql、Oracle、SQLServer、DB2等,这些不同类型的数据库使用的驱动程序各不相同,那JDK不可能把所有厂商的驱动都实现,只能制定一个标准接
//常量定义publicclassConstant{ publicstaticIntegerPM_YEAR_NO=5; } 复制 //action publicclassZhiBiaoPmActionextendsBaseAction{ privatestaticfinallongserialVersionUID=1L; @Autowired ZhiBiaoPmServicezbser; publicStringcn_pm25(){ Integeryear=Integer.valueOf(Tool.getCurDateByType("yyyy")); List<Map<String,Object>>pmlt=zbser.getPM25lt(year); request.setAttribute("year",year); JSONObjectresult=JSONObject.fromObject(zbser.dataset(pmlt,year)); request.setAttribute("result",result