如何对字符串排序并检测变位词?Java选择排序实现问题求助
问题排查与修复
1. 字符串处理逻辑错误
Java中String是不可变类,trim()、toLowerCase()等方法不会修改原字符串,只会返回处理后的新字符串,你没有接收返回值,所以处理逻辑完全不生效。另外trim()只能移除字符串首尾的空格,无法移除中间的空格,要忽略所有空格需要用replace(" ", "")替换所有空格字符。
2. 选择排序实现错误
你把交换逻辑写在了内层循环内部,会导致每找到一个更小的元素就执行一次交换,完全不符合选择排序「先遍历找到当前区间最小元素的下标,再统一执行一次交换」的逻辑,所以长字符串排序结果混乱。
3. 数组比较逻辑错误
==用于数组比较时,对比的是两个数组的内存地址,不是数组内容,要比较两个char数组的内容是否一致,需要使用Arrays.equals()方法。
修复后的完整代码
import java.util.Arrays; public class AnagramChecker { public static void selectionSort(char[] arr) { for (int i = 0; i < arr.length - 1; i++) { int least = i; // 内层循环仅负责查找当前区间最小元素的下标 for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[least]) { least = j; } } // 找到最小下标后再执行单次交换 if (least != i) { char swap = arr[i]; arr[i] = arr[least]; arr[least] = swap; } } } public static boolean anagramCheck(String x, String y) { // 接收处理后的新字符串:移除所有空格+统一转小写 x = x.replace(" ", "").toLowerCase(); y = y.replace(" ", "").toLowerCase(); // 长度不同直接判定不是变位词 if (x.length() != y.length()) { return false; } char[] xArr = x.toCharArray(); char[] yArr = y.toCharArray(); selectionSort(xArr); selectionSort(yArr); // 对比两个排序后数组的内容 boolean isAnagram = Arrays.equals(xArr, yArr); if (isAnagram) { System.out.println("It's an anagram."); } return isAnagram; } // 测试用例 public static void main(String[] args) { System.out.println(anagramCheck("Listen", "Silent")); // 输出true System.out.println(anagramCheck("Hello World", "world hello")); // 输出true System.out.println(anagramCheck("Apple", "Pale")); // 输出false } }
内容的提问来源于stack exchange,提问作者egg
相关产品推荐
相关产品推荐

