随笔分类 - Java
摘要:一.问题引入 前两天学代理模式的时候想到的,接口可不可以new呢? 接口是特殊的抽象类,接口的方法都默认为 public abstract 的。。。 抽象的方法不能new的哦,不能被实例化,为什么new ActionListener(){} 可以?不多说了,直接看资料。 二.若干资料 Java不能同时继承多个类,但...
阅读全文
摘要:这是今天做了一道字符串的问题,一直MLE,所以想到了减少Map里对应关系数量来降低内存开销。随手谷歌,整理出了如下资料。 如果效率优先的话还是写俩Map吧。 import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.Ma...
阅读全文
摘要:今天做题遇到的…… 由于读入的字符串可能包含空格,所以采用nextLine。 int n = sc.nextInt();for(int i=0; i<n; i++) { String s = sc.nextLine(); System.out.println(s);} 上面的代码只会输出n-1个字符串,最后一个没有输出,原因n...
阅读全文
摘要:这是2012年Java的本科B组蓝桥杯,C/C++的本科B组是连分数求黄金分割数,精确到100位,太难啦,问了好多学校的,没几个做出来的。 我当时用的是自带计算器,精度太小了。一.问题描述 黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,墙上的画像一般...
阅读全文
摘要:一.概念引入 在以往判断一个数n是不是素数时,我们都是采用i从2到sqrt(n)能否整除n.如果能整除,则n是合数;否则是素数.但是该算法的时间复杂度为O(sqrt(n)),当n较大时,时间性能很差,特别是在网络安全和密码学上一般都是需要很大的素数.而从目前来看,确定性算法判断素数的性能都不好,所以可以用MC(蒙特卡洛)概率算法来解决,其中Miller Rabin算法就是其中的很经典的解决方法.下面首先介绍下相关的数学理论。 理论基础:Fermat小定理:若n是素数,则对所有1≤a≤n-1的整数a,有a^(n-1)mod n=1;该定理的逆否命题也成立,即a^(n-1)mod n!=1,则n为
阅读全文
摘要:直接上代码……public class Swap { public static void main(String[] args) { int a[] = new int[]{1,2}; System.out.println(a[0] + " "+a[1]); swap(a,0,1); System.out.println(a[0] + " "+a[1]); }private static void swap(int[] a, int i, int j) { int temp = a[i]; ...
阅读全文
摘要:一.概念引入 设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为。这显然不能排除存在x∈Xn使得的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有。这就是舍伍德算法设计的基本思想。当s(n)与tA(n)相比可忽略时,舍伍德算法可获得很好的平均性能。 概率算法的一个特点是对同一实例多次运用同一概率算法结果可能同。舍伍德算法(O(sqrt(n)),综合了线性表和线性链表的优点)总能求的问题的一个正确解,当一个确定性算法在最坏情况和平均情况下差别较大时可在这个确定
阅读全文
摘要:一.线性同余法 随机数在计算机中扮演重要角色,不过现实中往往难以产生真正的随机数,很多教材上都采用了线性同余法,产生的随机数也只是在一定范围内,该范围的一定要比研究所使用的范围大,不能没有完全验证就又循环。 好事者称上面的性质为随机数要具有周期性,又要不具有周期性(晕),所谓周期性指的是到达一个足够大的数后又要重新开始,非周期性实际就是指范围要足够大,就像C/C++中要求RAND_MAX至少要是32767。 其中b >= 0,c >= 0,d 的范围),则只需要把上面的calCounts里的if改成y<x^3并且输出不乘以4就好了。四. 舍伍德(Sherwood)算法 五.拉
阅读全文
摘要:一.概念引入 有作者把计数排序也称为桶排序(各个桶中元素的排序采用计数排序),得到数组C后直接从前往后遍历,输出数组值次数组下标,为0就不输出(或者存入原数组,不稳定),不过笔者认为这种说法不严谨(一个很明显的问题是输出会是双重for循环,不过也有那个意思,叫鸽巢排序也未尝不可),因为桶排序要求输入数据在[0,1)范围内(计数排序要求整数;实际上要么全是整数,要么小数,便于划分桶),先把区间[0,1)划分成n个相同大小的子区间,称为桶,然后将n个输入数分布到各个桶中去。因为输入数均匀且独立分布在[0,1)上,所以,一般不会有很多数落在一个桶中的情况。为了得到结果,先对各个桶中的数进行排序,然后
阅读全文
摘要:今天学桶排序,因为需要随机产生[0,1)的等长小数,于是随手谷歌之,翻了些资料,与诸君共享……一.java.lang.Math 该类下边有random()方法,产生[0,1)的double值,注意1.0取不到;所以int p = (int)(Math.random()*10) 会产生[0,9]的整数值,没有10。 补充:Math.round(11.5) = 12,Math.round(-11.5) = -11,其实round函数相当于floor(x+0.5)。ps:这是一道真实的面试题,大公司的。 PI:Math.PI,自然对数是Math.E,还有log、log10、hypot、floor、.
阅读全文
摘要:一.准备知识 Java中变量分为基本数据类型和引用类型,前者分配在栈内,出了作用域就自动释放,后者分配在堆内或者常量池(比如字符串常量和基本数据类型常量),需要new出来。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。堆内存用于存放由new创建的对象和数组。数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针。 这里我们主要关心栈,堆和常量池,对于栈和常量池中的对象可以共享,对于堆中的对象不.
阅读全文
摘要:一.概念 基数排序也不是基于比较和元素移位的,又称桶子法;数据结构课本上首先由扑克牌的排序引入,继而引出多关键字比较。 本文是基于计数排序的基数排序,只介绍最低位优先(Least Significant Digit First),谷歌之发现就几乎没有介绍MSD的,所谓LSD就是从数字的最低位逐个比较,比较的趟数就是最大数字的位数digit,因此需要先用countDigit方法求出位数digit。 局限性:本算法是稳定的,LSD需要使用稳定的算法,由于按位比较,因此需要整数,和计数排序不同的是,整数可以是负数(各种排序都可以正负混合),也可以很大,为什么呢? 数值较大:由于是按比较,统计数字出现
阅读全文
摘要:一.算法简介 通过统计元素出现的次数进而排序,需要一个辅助数组,大小是最大元素值(想想计数的过程),为了更好的理解计数排序,我们先来想象一下如果一个数组里所有元素都是非负整数(数组下标是整数),而且都在0-max(由于内存的原因,这个值要小一些)以内,那对于数组里每个元素来说,如果我能知道数组里有多少项小于或等于该元素,就能准确地给出该元素在排序后的数组的位置。 局限性:通过上面的描述可以看出需要整数(若有负数,则正负数分别排序),而且最大值要在能开数组范围内。 算法是稳定的,算法第五步从后往前保证了稳定性,希望读者细细体会……二.算法描述求得元素最大值max(看算法实现过程,体会这个方法需要
阅读全文
摘要://-----------------------String a = "abcde";char[] b = a.toCharArray();char temp;for(int i=0;i=0;i--) { char chr = str.charAt(i); System.out.print (chr);} System.out.print("]"); String是线...
阅读全文
摘要:现在时间: 转译后生成的servlet,对应的body中,有以下代码: out.write("现在时间:\n");out.print( new Date());(java中)有这个方法:print(Object),没有这个方法:write(Object) 但是却有这个方法:write(String) 查找javaAPI,你便会发现。 ...
阅读全文
摘要:一.问题引入 谈到hashCode就不得不说equals方法,二者均在Object类里,由于Object类是所有类的基类,所以一切类里都可以重写这两个方法。要想较清晰的理解,需要先知道容器Collection,Set,list,Map(key值不可重复),Set元素无序不重复,list元素有序可重复,那么JVM是如何确定不同的元素的呢? 难道是逐个比较么,那样效率就太低了,JVM采用hash的方法(hash地址不一定是实际的物理地址),看看这个地址上是否有内容,没的话就认为不存在相同对象……且看下面分解……二.问题分析首先equals()和hashcode()这两个方法都是从object类中继
阅读全文
摘要:本文重在温习……不过初学以及进阶高手不可错过1. public static void arraycopy(全小写)(object src,int srcPos,object dest,int destPos,int length) 1 package b; 2 /* 3 * 使用java.lang.System类的静态方法,使用for循环一个一个拷贝会很慢,由于数组 4 * 在内存里往往都是连续的区域,因此最有效率的往往是直接拷贝内存。 5 * public static void arraycopy(全小写)(object src,int srcPos,object dest,i...
阅读全文
摘要:老师如是说:有一个规律永远不变,就是量变引起质变,什么时候你吃的盐比我吃的米多,那你就可以教我了……1.JDBC是一个标准,是J2EE的一部分;讲tcp时就提到了分层思想,jdbc也是分层,即上层只需要和紧挨着的下层通讯,方便扩展。不管开奥拓车还是开奥迪车方向盘都在屁股前边,档都在右边。不过jdbc还需要写select语句等,而hibernate完全实现了数据库底层,而且屏蔽了细小差别;现在的EJB也实现了某些功能。2.TestJDBC 若是连接字符串或者某些方法忘了(但是有些东西不能忘,比如System.out.println),就注明平时用多了Eclipse,若是查查还能知道…… 1...
阅读全文
摘要:1.ClassLoader的类加载机制:并非一次性加载,而是需要的时候加载(运行期间动态加载)(Class文件加载到内存的代码段),static语句块在加载后执行一次。dynamic语句块(就是一个语句块,用大括号括起来)每次new新的对象都会执行,等同于构造方法中的语句,只不过加载到构造方法之前,用的较少。注意参数的大小写,也不要多加空格。看下面这个例子: 1 public class Dynamic { 2 3 public static void main(String[] args) { 4 new A();//不是一次性加载,从结果看出这个分割线的位置 5 ...
阅读全文