论坛首页 综合技术论坛

一家公司的面试题

浏览 3911 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2013-03-03   最后修改:2013-03-03
字符串A是由n个小写英文字母(a ~ z)构成的,定义为char A[n]。你能用更少的空间表示这个字符串吗?请写出从char A[n]到你的新的储存格式的转换函数


以下是java代码实现
/**
* 字符串A是由n个小写英文字母(a ~ z)构成的, 定义为char A[n]。 你能用更少的空间表示这个字符串吗? 请写出从char
* A[n]到你的新的储存格式的转换函数。
*
* @author liwenli
*
*         a~z共26个字符,用五位bit存储,高1位单独存储,低4位单独存储
*/
public class CharBitMapStore {

private int length; // 要存储的字符串的长度
private byte highBits[]; // 高1位
private byte lowBits[]; // 低4位

public CharBitMapStore(int leng) {
this.length = leng;
int len = leng % 8 == 0 ? leng / 8 : leng / 8 + 1;
highBits = new byte[len]; // 高位数
int len2 = leng % 2 == 0 ? leng / 2 : leng / 2 + 1;
lowBits = new byte[len2]; // 低位数
}

public void charToBitMap(char[] a) throws Exception{
if (a == null || a.length == 0) {
throw new Exception("空字符串!");
} else {

String testStr = String.valueOf(a);
if (!testStr.matches("^[a-z]*$")) {
throw new Exception("字符串包含了a~z之外的字符!");
} else {

for (int i = 0; i < a.length; i++) {
char d = a[i];
byte num = (byte) (d - 97);
int m = i / 2;
int n = i % 2;
if (n == 0) {
lowBits[m] = (byte) (lowBits[m] | (num & 0xf));
} else if (n == 1) {
lowBits[m] = (byte) (lowBits[m] | ((num & 0xf) << 4));
}

int l = i % 8 == 0 ? i / 8 : i / 8 + 1;
if ((i % 8 != 0) && i < 8 ) {
l = i / 8;
}
int t = i % 8;

// 高位数
if ((num & 0x1f) >> 4 == 1) {
highBits[l] = (byte) (highBits[l] | (1 << t));
}
}
}
}
}

public void print() {
for (int i = 0; i < length; i++) {
int l = (i % 8 == 0) ? i / 8 : (i / 8 + 1);
if (i % 8 != 0 && i < 8 ) {
l = i / 8;
}
int t = i % 8;
int m = i / 2;
int n = i % 2;
// 高1位为1时
if ((t > 0) && ((highBits[l] >> t) & 0x1) == 1) {
// 存字节数组低四位
if (n == 0) {
char e = (char) (((lowBits[m] & 0xf) | 0x10) + 97);
System.out.print(e);
// 存字节数组高四位
} else if (n == 1) {
char f = (char) (((lowBits[m] >> 4 & 0xf) | 0x10) + 97);
System.out.print(f);
}
// 高1位为0时
} else {
if (n == 0) {
// 存字节数组低四位
char q = (char) (((lowBits[m] & 0xf)) + 97);
System.out.print(q);
} else if (n == 1) {
// 存字节数组高四位
char r = (char) (((lowBits[m] >> 4 & 0xf)) + 97);
System.out.print(r);
}
}

}
}

public static void main(String[] args) throws Exception {
char a[] = { 'a', 'f', 'e', 'e', 'c', 's', 'f' };
CharBitMapStore bitMapStore = new CharBitMapStore(a.length);
bitMapStore.charToBitMap(a);
bitMapStore.print();
}
}


   发表时间:2013-03-06  
你面试的算法相关职位?
0 请登录后投票
   发表时间:2013-03-07  
如果楼主先解释一下 说说如何分析的  然后详细说一下这个算法  那就更好了
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics