今天在面试时遇到一道算法的题:
给定一个字符串,输出每次字符出现的次数;要求按照顺序输出;
自己的思路开始是:
1.把String转换char数组
2.直接去遍历数组,获取每个字符出现次数,遇到不同时候重新记录
3.把结果用StringBuffer拼接后输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class Record { public static void main(String[] args) { System.out.println( "直接遍历数组的方法:" +compressStrArray( "aaacccddeffgghhhhaa" )); } //直接遍历数组拼接,获得对字符记录结果是有序的,但是会出现重复字符的情况,在去修改重复字符逻辑也比较麻烦 public static String compressStrArray(String srcStr) { char [] chars = srcStr.toCharArray(); char c = chars[ 0 ]; int i = 0 ; int a = 0 ; StringBuffer buffer = new StringBuffer(); for ( char aChar : 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+ " " ); } } return buffer.toString(); } } |
得到的结果是:3a 3c 2d 1e 2f 2g 4h 2a
结果虽然是有序的,但会出现重复字符记录的情况,修改起来比较麻烦,于是暂时放下了,如果不考虑重复只考虑有序的话可以使用这种方法
后来在晚上跑步的时候想到了可以使用map容器,一开始使用了HashMap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class Record { public static void main(String[] args) { System.out.println( "使用Linkedhashmap容器的方法:" +compressStrArrayLinkedHashMap( "cccddeffgghhhhaaa" )); } //先吧字母存在hashmap容器中,在从hashmap中拿出来拼接,顺序是计算hashcode后的顺序,不是放入字符的顺序 public static String compressStrArrayHashMap(String srcStr) { HashMap<Character, Integer> map = new HashMap<>(); char [] chars = srcStr.toCharArray(); for ( char aChar : chars) { if (map.get(aChar)!= null ) { map.put(aChar,map.get(aChar)+ 1 ); } else { map.put(aChar, 1 ); } } StringBuffer buffer = new StringBuffer(); for (Character character : map.keySet()) { if (map.get(character)!= 1 ) { buffer.append(map.get(character)).append(character+ " " ); } else { buffer.append(character+ " " ); } } return buffer.toString(); } } |
调整了一下字符,发现得到的结果是:3a 3c 2d e 2f 2g 4h
记录的顺序是计算hashcode后的顺序,不是放入字符的顺序,但是去掉了重复字符,如果单纯记录次数可以使用hashmap
最后在看api文档时候发现了还有一个LinkedHashMap可以保证放入对象的顺序,于是有将hashmap改为linkedhashmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | public class Record { public static void main(String[] args) { System.out.println( "使用Linkedhashmap容器的方法:" +compressStrArrayLinkedHashMap( "cccddeffgghhhhaaa" )); } public static String compressStrArrayLinkedHashMap(String srcStr) { LinkedHashMap<Character, Integer> map = new LinkedHashMap<>(); char [] chars = srcStr.toCharArray(); for ( char aChar : chars) { if (map.get(aChar)!= null ) { map.put(aChar,map.get(aChar)+ 1 ); } else { map.put(aChar, 1 ); } } StringBuffer buffer = new StringBuffer(); for (Character character : map.keySet()) { if (map.get(character)!= 1 ) { buffer.append(map.get(character)).append(character+ " " ); } else { buffer.append(character+ " " ); } } return buffer.toString(); } } |
最后得到结果是:3c 2d e 2f 2g 4h 3a
顺序是放入字符的顺序,也没有了重复,如果要保证有序不重复的记录应该使用LinkedHashMap来作为记录容器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/199314/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)