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
相关产品推荐
相关产品推荐

