You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,完全不符合预期。

错误原因分析

  1. 计数器未重置:counter变量在每次外层循环后没有清零,导致计数不断累加
  2. 重复处理字符:每个字符遍历一次就往结果里加一次,比如原字符串的两个a会被分别处理,导致结果里出现两次a相关的片段
  3. 统计范围不全:内层循环从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:30:54