java面试优化问题
来源:百度知道 编辑:UC知道 时间:2024/05/23 23:36:10
讲明白些!
哎..我昨天想了一晚上,总算想到一个比较笨的办法....
首先确定一点 定义为byte A[n] 占用空间n个字节
a-z,用01-26替换 例如九个z替换成九个26
zzzzzzzzz替换成262626262626262626
那么
定义 long lg=262626262626262626l;
此时就可以用lg来表示字符串"zzzzzzzz"
由于n=9,用byte数组时占用9个字节
一个long占用8个字节,因此用lg存放时节约空间比率为1/9
n大于9怎么办? 比如n=10,把10个z替换成10个26超过了long允许的最大值9223372036854775807
因此考虑使用long数组存放
先把字符串按9个字母一组拆分 再分别替换 ,存放进long数组
long[] lg= new long[(int)Math.ceil(n/9f)];
空间的节约率为
1-Math.ceil(n/9f)*8f/n
我算了一下,当n>55时 节约率在11%到12%之间
当n<55时,有时候节约,有时候反而更不节约
但是不管怎么说 这种方式都是得不偿失,把字母对应到数组就已经很让人难受了
二楼的方法,使用一个二维boolean数组来存放,真的是个很好的办法
不过可惜的是,一个boolean变量在虚拟机中实际上占用了4个字节!
根据网上一位高人的说法
boolean a=true;//这个a在JVM中占4个字节即:32位。
boolean[] b = new boolean[10];//数组时,每一个boolean在JVM中占一个字节,即:8位
因此,一个boolean变量至少占用1个字节,至多占用4个字节,占用1位好像没办法...
有办法了 开始以为最低要八位,,毕竟一个字节八位噢
后来想起来了...可以用五个布尔变量 来表示一个字母
以达到一