1、今天笔试一道题说一个字符串String A是由N个小写字母(a至z)构成,定义为byte A[N],用更少的空间表示这个字符串,并说出原理和节省空间的比率
2、一个人花30买的货物,40卖出,50买进,60卖出,问写个程序分析下他的经济效益
2、一个人花30买的货物,40卖出,50买进,60卖出,问写个程序分析下他的经济效益
解决方案 »
- 如何用HttpServletRequest request ,HttpServletResponse response
- 如何用java获得当前运行的进程信息
- 如何判断 JFrame 的状态
- 一个小游戏怎么写?————课后练习
- JAVA新手请教这一点点代码为什么错?
- 高分求助!关于jdbtable的一系列问题,回答每个问题都有分相送!如果此贴分数不够,可以到其它贴子上领取。
- 请问microsoft access中是否支持sql语句的嵌套?
- 请问SCJP要考Object Stream/Serializable Interface/Sockets吗?急急急
- client/server 模型??
- 初学java 为什么读取文件中内容时要用while语句进行循环读取
- system.in&out 与 java.io 里边定义的输入输出有什么区别?
- struts如何隐藏表单内容?
假设字符串为:aaaabcdeeefghiiii,那么可以压缩为:4a-3bcd3e-3fgh4i
解压时,被压缩的字符串一个为正整数N时,后面的一个字符将被展开N次,比如说4a,那么解开后是aaaa
如果,是负整数-N,那么说明后面跟的N个字符是没有被压缩的,比如说,-3bcd,那么还原后是bcd,
以此类推,可以还原出全部的。
压缩算法和解压算法都没有什么难度,就不多说了。
节省空间的比率要看重复数据的多少而定。连续的字符,比方说aaa,可以被压缩成3a,不连续的,比方说abc,变成了-3abc,长度会变长,考虑最坏情况,比方说aabcddefgghi....,变成2a-2bc2d-2ef2g-2hi,
每2个连续字符后紧跟2个不连续字符,那么空间可能是原来的2倍。但是,连续字符多的情况下,压缩率还是
非常可观的。
byte[] b=a.getByte(); 就可以了
完全可以代替由char[]实现的string
但是由于a-z的ascii码值在97-122之间,在byte能表示范围之间
所以用byte来存储能节省空间
首先在32位的机器上,一个Object占用的内存是8byte.一个引用占4byte
在来考虑String占用的内存public class String
{
private final char value[];
private final int offset;
private final int count;
private int hash;
}所以,不考虑那个char[]的占用,一个String最少占用 [8+4+4+4+4]=24bytes加上引用,共28bytes
在加上char[]所占的内存就等于28+[8+4+2*value.length]
用字节数组表示所占用的内存
4+8+4+1*length
比例你可以算一算注意的是jvm对所有的Object有限制!这个限制就是不管什么Object占的空间,要是8的倍数
long l[]=new long[N/12+1];
int index=0;
for(int i=0;i<l.length;i++)
{
for(int j=0;j<12;j++)
{
l[i]+=byte[index++];
if(j!=11)
{
l[i]<<5;
}
}
}
节省率:64/(12*8)=66.6%;
30 ----买入
40 ----卖出 赚 10 ---- +10
50 成本+10 即现在的成本是40
60 卖出 ------相对成本来说就+20
如此类推,即每一次买卖都会赚10public class WinMoney { public static void main(String[] args) {
System.out.println(getWinMoney(10,2));
}
/**
* @param win:每次赚的钱/再次买入添加的成本
* @param n:交易次数( 1 就表示1次买入和1次卖出)
* return 返回最后的总钱数
*/
public static int getWinMoney(int win,int n){
int winMoney=0;
if(n==1){
winMoney=win;
return winMoney;
}else if(n>1){
for(;n>=1;n--){
if(n==1){
winMoney+=win;
}else{
winMoney=getMoney(winMoney,win);
}
}
}else{
return winMoney;
}
return winMoney;
} private static int getMoney(int winMoney, int win) {
winMoney+=win;
return winMoney;
}
}
不知道是否符合题目意思。
public class WinMoney { public static void main(String[] args) {
System.out.println(getWinMoney(10,2));
}
/**
* @param win:每次赚的钱/再次买入添加的成本
* @param n:交易次数( 1 就表示1次买入和1次卖出)
* return 返回最后的利润数
*/
public static int getWinMoney(int win,int n){
int winMoney=0;
if(n==1){
winMoney=win;
return winMoney;
}else if(n>1){
return winMoney*n;
}else{
return winMoney;
}
} private static int getMoney(int winMoney, int win) {
winMoney+=win;
return winMoney;
}
}
5Bit-8Bit足够了,如果还想再小,就需要Huffman树了。PS:坚决反对倒买倒卖。
Byte A[]="abcd..z";
String A = new (A.getByte());
private double firstPrice, firstOut, secondPrice, secondOut;
public Penefit(double firstPrice, double firstOut, double secondPrice, double secondOut){
this.firstPrice = firstPrice;
this.firstOut = firstOut;
this.secondOut = secondOut;
this.secondPrice = secondPrice;
}
public double calcProfit(){
double upRate = (secondPrice - firstPrice)/firstPrice;//计算膨胀率
return ((firstOut-firstPrice)*(1+upRate) + (secondOut-secondPrice));
}
public static void main(String args[]){
Penefit p = new Penefit(30,40,50,60);
System.out.println(p.calcProfit());
}}