java面试优化问题

来源:百度知道 编辑:UC知道 时间:2024/05/23 23:36:10
字符串A是由n个小写英文字母组成(a-z),其定义为byte A[n],你能用更少的空间表示该字符串吗?请写出实现的原理和节省的空间比率。
讲明白些!

哎..我昨天想了一晚上,总算想到一个比较笨的办法....
首先确定一点 定义为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位好像没办法...

有办法了 开始以为最低要八位,,毕竟一个字节八位噢

后来想起来了...可以用五个布尔变量 来表示一个字母

以达到一