【发布时间】:2013-10-16 21:28:19
【问题描述】:
给定一个字符串数组,找出特定字符出现的频率。
例如。给定数组 {"hon","bhig","zzz","hello"} 和字符 'h',输出为 3。
我是这样解决的: 方法 1:遍历数组中的每个字符串,每次在当前字符串中出现该字符时递增一个计数器。运行时间为 O(n),其中 n 是数组中所有字符串的累积长度。
方法 2:这可以使用 HashMap 进行优化;如果字符串在数组中重复,这将特别有用。这就是我所做的:获取一个 HashMap,其中键 = 字符串,值 = 字符串在数组中出现的次数。将给定数组中的所有字符串连同它们的计数一起放入 HashMap。然后遍历 HashMap 中的每个键值对,计算给定字符在键(字符串)中出现的次数,并将其在 HashMap 中的对应值递增。
我的问题是:有没有更好的方法来做到这一点?
代码如下:
注意:请阅读完整的已接受答案。
public static int findFreq(String[] arr,char c) {
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i=0;i<arr.length;i++) {
if(map.containsKey(arr[i]))
map.put(arr[i],map.get(arr[i])+1);
else
map.put(arr[i], 1);
}
int freq=0;
for(Entry<String,Integer> entr:map.entrySet()) {
String s = entr.getKey();
for(int i=0;i<s.length();i++) {
if(s.charAt(i)==c)
freq += entr.getValue();
}
}
return freq;
}
【问题讨论】:
-
看到你将不得不查看数组中的每个单独的字符来解决这个问题,你永远不会比 O(n) 做得更好。我看不出用字符串做地图有什么帮助(事实上,如果你再也不想看
arr,你就不需要地图了)。如果你想保留它,我会从字母表中的每个字母映射到它出现的次数(即h --> 3)。 -
计算字符串的哈希码需要查看每个字母。假设哈希码可能已经计算过一次(并因此被缓存),第二种方法可能需要更多的工作,并且(平均而言)不能减少工作。仅当字符串计数显着大于 1 时,才能节省成本。
标签: java arrays string algorithm