面试题:计算字符串中各个字符出现的次数
前言
昨天同事随口问了一道面试题:计算字符串中各个字符出现的次数,比如给定字符串 “aaabbcdd”,输出 “a3b2c1d2”。
分析
方法一:分割字符,获取字符数组或者集合,进行分组
方法二:比如取出第一个字符 a 先,将字符串中的 a 都替换 “”,则字符串就变成 “bbcdd”,根据长度,就可以出 a 的个数;将新的字符串重复此操作,直到字符串为 “”。
方法一:拆分
获取字符数组或集合
// 使用 Java 原生的方法,获取字符数组
char[] chars = string.toCharArray();
// 使用 subString 来切分,获取字符集合
List<String> charList = new ArrayList<>();
for (int i = 0; i < string.length(); i++) {
String charString = string.substring(i, i + 1);
charList.add(charString);
}
// 使用 Guava 的 Splitter 类按长度分割
List<String> charListBySplitter = Splitter.fixedLength(1).splitToList(string);
分组
// 使用 Map 来进行分组,key 为字符,value 为数量
Map<String, Integer> charGroup = new TreeMap<>();
for (int i = 0; i < charList.size(); i++) {
String charString = charList.get(i);
Integer count = 1;
if (charGroup.containsKey(charString)) {
count += charGroup.get(charString);
}
charGroup.put(charString, count);
}
// 使用 Java 8 Lambda 进行分组
Map<String, List<String>> charGroupByLambda = charList.stream().collect(Collectors.groupingBy(s -> s));
方法二:替换
// 如果没要求字符排序的话,可以直接如下操作
public void charCountByReplace(String string) {
charCountByReplace1(string);
System.out.println();
}
private void charCountByReplace1(String string) {
if (string != null && !"".equals(string)) {
String headChar = string.substring(0, 1);
String replaceString = string.replace(headChar, "");
System.out.print(headChar + (string.length() - replaceString.length()));
charCountByReplace1(replaceString);
}
}
后记
四个小例子:https://github.com/hochenchong/learnJava/blob/master/src/test/java/algorithm/CharCountTest.java,例子以直接输出到控制台的方式,需要返回新的字符串的话,修改一下即可。
在实践中成长!
HochenChong
2020-05-16