如何在Java中不使用数组或集合统计字符串的字符频率
字符频率统计实现(禁止使用数组/集合)
需求说明
输入一个字符串,生成对应的字符频率分布字符串:
- 每个不同字符后跟其出现次数,格式为
xd(x是字符,d是次数) - 每个字符在输出中仅出现一次
- 实现时不能使用数组或任何集合类
示例
Source: "aasdddr" Result: "a2s1d3r1" Source: "aabacc" Result: "a3b1c2" Source: "aasdddraabcdaa" Result: "a6s1d4r1b1c1"
问题代码及错误输出
我尝试了以下代码:
String str = "aasdddr", result = ""; int counter = 0; for(int i = 0; i < str.length(); i++){ result += "" + str.charAt(i); for(int j = 1; j < str.length(); j++){ if(str.charAt(i) == str.charAt(j)){ counter++; } } result += counter; } System.out.println(result);
但输出结果是a1a2s3d6d9d12r13,完全不符合预期。
错误原因分析
- 计数器未重置:
counter变量在每次外层循环后没有清零,导致计数不断累加 - 重复处理字符:每个字符遍历一次就往结果里加一次,比如原字符串的两个
a会被分别处理,导致结果里出现两次a相关的片段 - 统计范围不全:内层循环从
j=1开始,漏掉了索引0的字符,导致第一次统计a时少算一次
正确实现代码
String str = "aasdddr"; String result = ""; for (int i = 0; i < str.length(); i++) { char currentChar = str.charAt(i); // 检查当前字符是否已经被统计过(结果里没出现过才处理) if (result.indexOf(currentChar) == -1) { int count = 0; // 遍历整个字符串统计当前字符的总次数 for (int j = 0; j < str.length(); j++) { if (str.charAt(j) == currentChar) { count++; } } // 把字符和次数拼到结果里 result += currentChar + String.valueOf(count); } } System.out.println(result); // 输出:a2s1d3r1
关键说明
- 用
result.indexOf(currentChar) == -1判断字符是否已处理:因为结果字符串里每个字符只会出现一次,所以只要结果里找不到这个字符,就说明还没统计过 - 每次统计新字符前重置
count:确保计数是当前字符的准确出现次数,不会和之前的统计混淆 - 内层循环从
j=0开始:覆盖整个字符串,保证统计没有遗漏
内容的提问来源于stack exchange,提问作者Nevzat Talha Özcan
相关产品推荐
相关产品推荐

