浏览 3911 次
锁定老帖子 主题:一家公司的面试题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2013-03-03
最后修改:2013-03-03
以下是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(); } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2013-03-06
你面试的算法相关职位?
|
|
返回顶楼 | |
发表时间:2013-03-07
如果楼主先解释一下 说说如何分析的 然后详细说一下这个算法 那就更好了
|
|
返回顶楼 | |