基于java查找并打印输出字符串中字符出现次数
今天在面试时遇到一道算法的题:
给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;
自己的思路开始是:
1.把String转换char数组
2.直接去遍历数组,获取每个字符出现次数,遇到不同时候重新记录
3.把结果用StringBuffer拼接后输出
publicclassRecord{ publicstaticvoidmain(String[]args){ System.out.println("直接遍历数组的方法:"+compressStrArray("aaacccddeffgghhhhaa")); } //直接遍历数组拼接,获得对字符记录结果是有序的,但是会出现重复字符的情况,在去修改重复字符逻辑也比较麻烦 publicstaticStringcompressStrArray(StringsrcStr){ char[]chars=srcStr.toCharArray(); charc=chars[0]; inti=0; inta=0; StringBufferbuffer=newStringBuffer(); for(charaChar:chars){ a++; if(aChar!=c){ buffer.append(i).append(c+""); c=aChar; i=1; }else{ i++; } if(a>=chars.length){ buffer.append(i).append(c+""); } } returnbuffer.toString(); } }
得到的结果是:3a3c2d1e2f2g4h2a
结果虽然是有序的,但会出现重复字符记录的情况,修改起来比较麻烦,于是暂时放下了,如果不考虑重复只考虑有序的话可以使用这种方法
后来在晚上跑步的时候想到了可以使用map容器,一开始使用了HashMap
publicclassRecord{ publicstaticvoidmain(String[]args){ System.out.println("使用Linkedhashmap容器的方法:"+compressStrArrayLinkedHashMap("cccddeffgghhhhaaa")); } //先吧字母存在hashmap容器中,在从hashmap中拿出来拼接,顺序是计算hashcode后的顺序,不是放入字符的顺序 publicstaticStringcompressStrArrayHashMap(StringsrcStr){ HashMapmap=newHashMap<>(); char[]chars=srcStr.toCharArray(); for(charaChar:chars){ if(map.get(aChar)!=null){ map.put(aChar,map.get(aChar)+1); }else{ map.put(aChar,1); } } StringBufferbuffer=newStringBuffer(); for(Charactercharacter:map.keySet()){ if(map.get(character)!=1){ buffer.append(map.get(character)).append(character+""); }else{ buffer.append(character+""); } } returnbuffer.toString(); } }
调整了一下字符,发现得到的结果是:3a3c2de2f2g4h
记录的顺序是计算hashcode后的顺序,不是放入字符的顺序,但是去掉了重复字符,如果单纯记录次数可以使用hashmap
最后在看api文档时候发现了还有一个LinkedHashMap可以保证放入对象的顺序,于是有将hashmap改为linkedhashmap
publicclassRecord{ publicstaticvoidmain(String[]args){ System.out.println("使用Linkedhashmap容器的方法:"+compressStrArrayLinkedHashMap("cccddeffgghhhhaaa")); } publicstaticStringcompressStrArrayLinkedHashMap(StringsrcStr){ LinkedHashMapmap=newLinkedHashMap<>(); char[]chars=srcStr.toCharArray(); for(charaChar:chars){ if(map.get(aChar)!=null){ map.put(aChar,map.get(aChar)+1); }else{ map.put(aChar,1); } } StringBufferbuffer=newStringBuffer(); for(Charactercharacter:map.keySet()){ if(map.get(character)!=1){ buffer.append(map.get(character)).append(character+""); }else{ buffer.append(character+""); } } returnbuffer.toString(); } }
最后得到结果是:3c2de2f2g4h3a
顺序是放入字符的顺序,也没有了重复,如果要保证有序不重复的记录应该使用LinkedHashMap来作为记录容器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。