发表时间:2008-04-23
nmvr2600 写道 第三个,使用正则表达式\b(?i)[s|t|o|p]{4}\b,搞定~~ 我觉得你是不是对这道题理解有误呀,应该不是这么简单的。 |
|
发表时间:2008-04-23
nmvr2600 写道 第一个题和论坛ruby版里那个“容易记的电话号码”有些类似
第二个,就是统计生日最多的哪一天,但是生日里面的年可以直接忽略掉,需要的就只有月日。月和日不要一起统计,先算月。先把生日最多的那个月份找到,再去统去到底是哪一天。呵呵,这样最后需要计算个数的人就少了很多了吧。直接去算每天出现的人数还是有点笨。如果数据量再多的话,可以借用下数理统计的知识。 第三个,使用正则表达式\b(?i)[s|t|o|p]{4}\b,搞定~~ “先把生日最多的那个月份找到”的时候,怎么都得遍历一次吧。。 再统计天的话,又部分遍历一次。。哪里减小了运算量啊。。 把月和日当成一个整体作为key,遍历一次就可以了。。 这个正则表达式可以吗。。似乎"tttt"这种字符串也能匹配上 |
|
发表时间:2008-04-23
7thbyte 写道 nmvr2600 写道 第一个题和论坛ruby版里那个“容易记的电话号码”有些类似
第二个,就是统计生日最多的哪一天,但是生日里面的年可以直接忽略掉,需要的就只有月日。月和日不要一起统计,先算月。先把生日最多的那个月份找到,再去统去到底是哪一天。呵呵,这样最后需要计算个数的人就少了很多了吧。直接去算每天出现的人数还是有点笨。如果数据量再多的话,可以借用下数理统计的知识。 第三个,使用正则表达式\b(?i)[s|t|o|p]{4}\b,搞定~~ “先把生日最多的那个月份找到”的时候,怎么都得遍历一次吧。。 再统计天的话,又部分遍历一次。。哪里减小了运算量啊。。 把月和日当成一个整体作为key,遍历一次就可以了。。 这个正则表达式可以吗。。似乎"tttt"这种字符串也能匹配上 把月和日当成一个整体作为key的话,需要遍历365个元素。 而将月和日分开的话,只需要遍历12+31个元素。 但是后一种方法需要同时在两个collection里插入,可能有点得不尝失 |
|
发表时间:2008-04-23
出题这人最近在看编程之美。。。。。。。。。把题目改吧改吧就拿出来考人了
|
|
发表时间:2008-04-23
第三题,26个字母对应2开始的26个质数,对每个词求乘积,结果一样的认为是等价的
前提:不考虑乘法溢出,复杂度上界O(line_of_file * max_word_len) |
|
发表时间:2008-04-23
某个月份生日最多并不能保证生日最多的那一天在此月份里啊
|
|
发表时间:2008-04-23
第三个 对所有单词的字符进行排序,生成新单词后做相等比较
|
|
发表时间:2008-04-23
7thbyte 写道 nmvr2600 写道 第一个题和论坛ruby版里那个“容易记的电话号码”有些类似
第二个,就是统计生日最多的哪一天,但是生日里面的年可以直接忽略掉,需要的就只有月日。月和日不要一起统计,先算月。先把生日最多的那个月份找到,再去统去到底是哪一天。呵呵,这样最后需要计算个数的人就少了很多了吧。直接去算每天出现的人数还是有点笨。如果数据量再多的话,可以借用下数理统计的知识。 第三个,使用正则表达式\b(?i)[s|t|o|p]{4}\b,搞定~~ “先把生日最多的那个月份找到”的时候,怎么都得遍历一次吧。。 再统计天的话,又部分遍历一次。。哪里减小了运算量啊。。 把月和日当成一个整体作为key,遍历一次就可以了。。 这个正则表达式可以吗。。似乎"tttt"这种字符串也能匹配上 如果他的意思是那四个字母必须都有我这么写就是不对的,再第一个的基础上再检验下有没有重复的好了(\w).*?\1 |
|
发表时间:2008-04-23
manbearpig1 写道 第三题,26个字母对应2开始的26个质数,对每个词求乘积,结果一样的认为是等价的
前提:不考虑乘法溢出,复杂度上界O(line_of_file * max_word_len) 这个很不错.但问题是每个字母都要转换一边是否高效? 数字不会很大怎么会溢出的? 呵呵,这么一说倒是想起来了,如果再在题目上加上对于空间或者时间的要求,可能就更难一层了 忘记曾经是哪个公司的题目中作此要求 |
|
发表时间:2008-04-23
2.3的思路:
注意到每组anagram的字母在忽略组合顺序与大小写时完全相同 可以考虑对单词做如下转换,将一组anagram映射到唯一一个字符串上 转换方法,最简单的是将单词的各个字母变成小写,在按照字母顺序排序 如下: XkLs→klsx 然后,可以将转换结果与单词本身缓存到Map中, 注意到转换结果与单词是1:N的关系 可以考虑用apache的Commons Collections包的org.apache.commons.collections.MultiHashMap来缓存,以转换结果为key,单词为value 以下是这个处理的参考实现 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.collections.MultiHashMap; public class AnagramUtil { /** * 从输入的字符串数组中得到Anagram * 假定:字符串全部都是由a-z、A-Z组成的 * * @param strArray * @return List<Set> */ public static List searchAllAnagram(String[] strArray) { if (strArray == null || strArray.length == 0 ){ return Collections.EMPTY_LIST; } MultiHashMap multiMap = new MultiHashMap(); for (int i = 0 ; i < strArray.length ; i++) { String word = strArray[i]; String key = convertWord(word); multiMap.put(key, word); } List result = new ArrayList(); for (Iterator i = multiMap.keySet().iterator() ; i.hasNext(); ) { String key = (String)i.next(); if (multiMap.size(key) < 2 ){ continue; } Set valueSet = new HashSet(multiMap.getCollection(key)); if (valueSet.size() < 2 ){ continue; } result.add(valueSet); } return result; } public static String convertWord(String word) { if (word == null ){ return ""; } char[] charArray = word.toLowerCase().toCharArray(); Arrays.sort(charArray); return String.valueOf(charArray); } public static void main(String[] args) { String[] strArray = new String[]{ "abc", "BcA", "Cba", "abcd", "BBcA", "aXbB", "zzxYyy", "yyZzxy", "rsuT", "turS", "fix", "xiF", "dcna", "abcd" }; List result = searchAllAnagram(strArray); for (int i = 0 ; i < result.size() ; i++) { System.out.println("=========Anagram " + i + " : ========="); Set anagram = (Set)result.get(i); for (Iterator j = anagram.iterator() ; j.hasNext() ; ) { System.out.println(j.next()); } } } } 结果: =========Anagram 0 : ========= zzxYyy yyZzxy =========Anagram 1 : ========= fix xiF =========Anagram 2 : ========= rsuT turS =========Anagram 3 : ========= Cba BcA abc |