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

Java按元音数冒泡排序字符串数组不生效问题排查

问题定位

你写的冒泡排序同步交换计数和字符串的逻辑本身没有问题,排序失效的核心原因是元音计数部分的变量作用域写错了,导致numVowels数组里存储的不是每个字符串的总元音数量,排序依据完全错误。
具体错误点:

  • 计数变量count被定义在了遍历单个字符串字符的内层j循环内部,每检查一个字符就会把count重置为0
  • 每次检查完当前字符后,立刻把临时的count值赋值给numVowels[i],等整个字符串遍历结束,numVowels[i]里只保留了「字符串最后一个字符是否为元音」的结果:最后一个字符是元音值为1,否则为0,前面所有字符的统计结果全被覆盖丢失了
修正后代码

只需要调整count变量的位置:把count的初始化移到遍历单个字符串的循环外层,等整个字符串的所有字符都统计完成后,再把总计数存入numVowels数组即可,冒泡排序部分不需要改动,完整修正代码如下:

public static String[] sortByVowels(String[] a) {
    String[] copy = a.clone();
    int[] numVowels = new int[copy.length];

    for(int i = 0; i < copy.length; i++) {
        // 初始化当前字符串的元音计数器,移到字符遍历循环外
        int count = 0;
        for(int j = 0; j < copy[i].length(); j++) {
            char ch = copy[i].charAt(j);
            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') {
                count++;
            }
        }
        // 整个字符串遍历完成后再存储总元音数
        numVowels[i] = count;
    }

    // 原冒泡排序逻辑正确,无需修改
    for (int c = 0; c < copy.length - 1; c++) {
        for(int d = 0; d < copy.length - c - 1; d++) {
            if (numVowels[d] > numVowels[d+1]) {
                // 交换元音计数
                int swapInt = numVowels[d];
                numVowels[d] = numVowels[d+1];
                numVowels[d+1] = swapInt;
                
                // 同步交换对应位置的字符串
                String swapString = copy[d];
                copy[d] = copy[d+1];
                copy[d+1] = swapString;
            }
        }
    }
    return copy;
}
补充提示

如果测试用例中包含大写的元音字母(A/E/I/O/U),当前的判断逻辑不会统计这类字符,有需要的话可以在判断条件中补充大写元音的匹配规则,或者先把字符转为小写再做判断。

内容的提问来源于stack exchange,提问作者OMeihls

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:15:40