当前位置: 代码迷 >> 高性能计算 >> 淘宝笔试 编程 议论
  详细解决方案

淘宝笔试 编程 议论

热度:8251   发布时间:2013-02-26 00:00:00.0
淘宝笔试 编程 讨论
1  一篇英文文章内容,用最高效的数据结构和算法  打印出这篇英文文章里边出现的英文单词  和  它出现的次数,并说下你用的数据结构和算法
2  有一棵树 每个节点存放着字符串或者是整数,将这棵树上的数据和树的结构存储在一个文件并且在需要要恢复的时候能够进行恢复
大家踊跃发言,也许灵感就产生了
------解决方案--------------------------------------------------------
测试了好几种读取统计方法FileInputStream,DataInputStream,BufferedReader,RandomAccessFile,FileChannel,FileChannel Map , 目前发现下面这种做法时间最少,效率最高。

public static Map test() throws IOException {
HashMap<String ,Integer> hashMap = new HashMap<String ,Integer>();
FileChannel fc = new RandomAccessFile(new File("c:/test.txt"), "rw")
.getChannel();
ByteBuffer buffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());
byte b = 0; 
StringBuffer sb = new StringBuffer();    
boolean flagOther = true; //刚刚读取的字符是否为非单词字符(其他字符),这里假设单词字符只允许 a-z A-z - 27种
while(buffer.hasRemaining()){
    b = buffer.get();//
    if(b>=97&&b<=122 
------解决方案--------------------------------------------------------
 b>=65&&b<=90 
------解决方案--------------------------------------------------------
b == 45){
sb.append((char)b);
if(flagOther == true)flagOther = false;//只要读到单词字符,就认为没有读到 其他字符
    }    
    else {
if(flagOther == false){//前面读到的是单词字符,这一次读到其他字符,就将把缓冲区内容它打印出来
    System.out.println(sb.toString());
    String tempWord = sb.toString();
    hashMap.put(tempWord, hashMap.containsKey(tempWord)? hashMap.get(tempWord) + 1:1); 
    sb.delete(0,sb.length());
    flagOther = true;//因为读到其他字符,所以将它设为真
}
    }
}
   System.out.println(sb.toString());//已经到了文件尾
    sb.delete(0,sb.length());
fc.close();
return hashMap;
    }



  public static void main(String[] args) throws IOException {
Map <String ,Integer> map = test();
Set <String>set = map.keySet();
for(Iterator<String> iterator = set.iterator(); iterator.hasNext()  ;){
    String tempWord = iterator.next();
    System.out.println(tempWord + "  " + map.get(tempWord));
}
    }






------解决方案--------------------------------------------------------
加上注释
	public static void main(String[] args) {
String str = "Do you know? you are a good boy. very good. Do you want to play with me";
testReg(str.toLowerCase());
}

public static void testReg(String str) {
Matcher matcher = Pattern.compile("\\b(\\w+?)\\b").matcher(str);
boolean find = matcher.find();// 是否找到匹配结果
String word = null;
int i = 0;
if (find) {
word = matcher.group(1);// 第一个单词
  相关解决方案