所以我正在开发一种算法来计算给定单词中每个字符的重复次数。我使用HashMap
并将每个唯一字符添加到HashMap
作为键,值是重复次数。我想知道我的解决方案的运行时间是什么,以及是否有更有效的方法来解决问题。
以下是代码:
public static void getCount(String name){
public HashMap<String, Integer> names = new HashMap<String, Integer>() ;
for(int i =0; i<name.length(); i++){
if(names.containsKey(name.substring(i, i+1))){
names.put(name.substring(i, i+1), names.get(name.substring(i, i+1)) +1);
}
else{
names.put(name.substring(i, i+1), 1);
}
}
Set<String> a = names.keySet();
Iterator i = a.iterator();
while(i.hasNext()){
String t = (String) i.next();
System.out.println(t + " Ocurred " + names.get(t) + " times");
}
}
答案 0 :(得分:2)
该算法的时间复杂度为O(n)
,但我会更改您实施的某些部分,即:
get()
代替containsKey()
+ get()
; charAt()
代替substring()
,这将创建一个新的String
对象; Map<Character, Integer>
代替Map<String, Integer>
,因为您只关心单个字符,而不是整个String
:换句话说:
public static void getCount(String name) {
Map<Character, Integer> names = new HashMap<Character, Integer>();
for(int i = 0; i < name.length(); i++) {
char c = name.charAt(i);
Integer count = names.get(c);
if (count == null) {
count = 0;
}
names.put(c, count + 1);
}
Set<Character> a = names.keySet();
for (Character t : a) {
System.out.println(t + " Ocurred " + names.get(t) + " times");
}
}
答案 1 :(得分:1)
从算法的角度来看,你的解决方案是O(n),这已经是最优的(至少你需要检查整个字符串中的每个字符至少一次是O(n))。
然而,有几种方法可以加快速度,减少不断的开销,例如
HashMap<Character,Integer>
。字符将比长度为1的字符串更有效。charAt(i)
代替substring(i,i+1)
。这样可以避免创建一个可以帮助你的新String。可能是你可以做出的最大的改进。int[]
数组来计算单个字符而不是HashMap,并将字符的ASCII值用作索引。阵列。如果你的字符串很短,这不是一个好主意。答案 2 :(得分:0)
将初始时间存储到变量中,如下所示:
long start = System.currentTimeMillis();
然后在结束时,当你完成时,打印出当前时间减去开始时间:
System.out.println((System.currentTimeMillis() - start) + "ms taken");
看看做的时间。据我所知,这是最有效的方法,但可能还有另一种好的方法。此外,对每个单独的字符使用char而不是字符串(因为char / Character是字符的最佳类,一系列字符的字符串)然后执行name.charAt(i)
而不是name.substring(i, i+1)
并将您的hashmap更改为HashMap&lt ;字符,整数&gt;
答案 3 :(得分:0)
String s =“good”;
//collect different unique characters
ArrayList<String> temp=new ArrayList<>();
for (int i = 0; i < s.length(); i++) {
char c=s.charAt(i);
if(!temp.contains(""+c))
{
temp.add(""+s.charAt(i));
}
}
System.out.println(temp);
//get count of each occurrence in the string
for (int i = 0; i < temp.size(); i++) {
int count=0;
for (int j = 0; j < s.length(); j++) {
if(temp.get(i).equals(s.charAt(j)+"")){
count++;
}
}
System.out.println("Occurance of "+ temp.get(i) + " is "+ count+ " times" );
}*/