Java大小写字母交替排序程序测试失败,求修正方案
字符串大小写交替有序排序问题分析与修复
问题描述
需求:将包含大小写字母的字符串按大小写交替且各自有序的方式排序,输入示例HelLoWoRld,预期输出HdLeRlWloo。现有Java代码仅通过3/8测试用例,需排查问题并给出正确实现。
现有代码:
import java.util.Arrays; import java.util.Scanner; public class SortDriver { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter the String: "); String input = scanner.nextLine(); String sortedString = sortString(input); System.out.println("The Sorted String is: " + sortedString); } public static String sortString(String str) { StringBuilder sorted = new StringBuilder(); // Separate lowercase and uppercase letters StringBuilder lower = new StringBuilder(); StringBuilder upper = new StringBuilder(); for (char ch : str.toCharArray()) { if (Character.isLowerCase(ch)) { lower.append(ch); } else if (Character.isUpperCase(ch)) { upper.append(ch); } } // Sort the lowercase and uppercase letters char[] lowerChars = lower.toString().toCharArray(); char[] upperChars = upper.toString().toCharArray(); Arrays.sort(lowerChars); Arrays.sort(upperChars); // Merge the sorted lowercase and uppercase letters alternately int i = 0, j = 0; while (i < lowerChars.length || j < upperChars.length) { if (i < lowerChars.length) { sorted.append(lowerChars[i++]); } if (j < upperChars.length) { sorted.append(upperChars[j++]); } } return sorted.toString(); } }
现有代码的问题分析
- 合并顺序完全颠倒:需求的交替逻辑是先大写,后小写循环交替(如示例的
H→d→L→e...),但代码是先添加小写字符,再添加大写字符,导致输出顺序与预期完全相反。 - 交替轮次逻辑错误:当前逻辑会按"小写→大写"的顺序交叉添加,起始方向不符合要求,最终输出结构与需求的大小写交替模式不匹配。
注:代码中分离大小写、各自排序的逻辑是正确的,问题仅出在合并阶段。
正确实现方案
修正合并阶段的逻辑,遵循先大写、后小写的交替顺序,当其中一组字符耗尽后,直接追加另一组剩余的所有字符。
修正后的完整代码:
import java.util.Arrays; import java.util.Scanner; public class SortDriver { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter the String: "); String input = scanner.nextLine(); String sortedString = sortString(input); System.out.println("The Sorted String is: " + sortedString); } public static String sortString(String str) { StringBuilder sorted = new StringBuilder(); // Separate lowercase and uppercase letters StringBuilder lower = new StringBuilder(); StringBuilder upper = new StringBuilder(); for (char ch : str.toCharArray()) { if (Character.isLowerCase(ch)) { lower.append(ch); } else if (Character.isUpperCase(ch)) { upper.append(ch); } } // Sort the lowercase and uppercase letters char[] lowerChars = lower.toString().toCharArray(); char[] upperChars = upper.toString().toCharArray(); Arrays.sort(lowerChars); Arrays.sort(upperChars); // Merge with correct alternate order: uppercase first, then lowercase int lowerIdx = 0, upperIdx = 0; while (lowerIdx < lowerChars.length || upperIdx < upperChars.length) { // Add uppercase character if available if (upperIdx < upperChars.length) { sorted.append(upperChars[upperIdx++]); } // Add lowercase character if available if (lowerIdx < lowerChars.length) { sorted.append(lowerChars[lowerIdx++]); } } return sorted.toString(); } }
测试验证
针对输入HelLoWoRld:
- 分离后小写字符为
e,l,o,o,l,d,排序后为d,e,l,l,o,o - 分离后大写字符为
H,L,W,R,排序后为H,L,R,W - 合并过程:
H→d→L→e→R→l→W→l→o→o,最终输出HdLeRlWloo,与预期一致。
额外说明
如果需求中交替的起始方向(先大写/先小写)需要动态调整,可根据两组字符的数量决定:哪组数量多就从哪组开始,但根据示例要求,固定先大写即可。
内容的提问来源于stack exchange,提问作者Amaan Rasool
相关产品推荐
相关产品推荐

