【发布时间】:2022-10-25 15:22:33
【问题描述】:
我正在尝试赎金记录挑战:
给定两个字符串ransomNote和magazine,如果ransomNote可以使用来自magazine的字母构造,则返回true,否则返回false。
杂志中的每个字母只能在赎金笔记中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:假 示例 2:
输入:ransomNote = "aa",杂志 = "ab" 输出:假 示例 3:
输入:ransomNote = "aa",杂志 = "aab" 输出:真
这是我的解决方案:
public static boolean canConstruct(String ransomNote, String magazine) {
ArrayList<Character> ransomChar = new ArrayList<Character>();
ArrayList<Character> magazineChar = new ArrayList<Character>();
if (ransomNote.length() == 1 && magazine.length() == 1) {
if (ransomNote.equals(magazine)) {
return true;
}
return false;
}
else if (ransomNote.length() == 1 && magazine.length() > 1) {
for (int i = 0; i < magazine.length(); i++) {
if (magazine.charAt(i) == ransomNote.charAt(0)) {
return true;
}
}
return false;
}
else if (ransomNote.length() > 1 && magazine.length() > 1) {
for (int i = 0; i < ransomNote.length(); i++) {
ransomChar.add(ransomNote.charAt(i));
}
for (int i = 0; i < magazine.length(); i++) {
magazineChar.add(magazine.charAt(i));
}
while (ransomChar.size() > 1) {
for (int i = 0; i < ransomChar.size(); i++) {
boolean flag = false;
for (int j = 0; j < magazineChar.size(); j++) {
if (ransomChar.get(i).equals(magazineChar.get(j))) {
ransomChar.remove(i);
magazineChar.remove(j);
flag = true;
}
else if (ransomChar.isEmpty()) {
return true;
}
}
if (!flag) {
return false;
}
}
}
if (ransomChar.size() == 1 && magazineChar.size() == 1) {
if (ransomChar.equals(magazineChar)) {
return true;
}
return false;
}
else if (ransomChar.size() == 1 && magazineChar.size() > 1) {
for (int i = 0; i < magazineChar.size(); i++) {
if (ransomChar.get(0).equals(magazineChar.get(i))) {
return true;
}
}
return false;
}
}
return false;
}
我正在通过大多数测试用例,但它在输入时引发错误:
"bg"
"efjbdfbdgfjhhaiigfhbaejahgfbbgbjagbddfgdiaigdadhcfcj"
它抛出错误:
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
at line: if (ransomChar.get(i).equals(magazineChar.get(j)))
【问题讨论】:
-
欢迎来到堆栈溢出。它抛出什么错误?请把错误放在你的问题中,包括堆栈跟踪。
-
抱歉,我刚刚更新了它。
-
您正在尝试从空字符串中提取第一个字符,而 Java 抱怨这是不允许的。 .最好使用 IDE 的调试模式运行代码,看看为什么会发生这种情况
-
您正在从正在迭代的列表中删除项目。这通常是一个坏主意,并且会搞砸你的逻辑。当您从列表中删除一个项目时,之后的所有项目都会向下移动一个插槽。但是无论如何你都会增加循环索引。充其量,你跳过了你应该考虑的字符,更糟糕的是,你会像你看到的那样崩溃。你需要重新考虑你的循环是如何工作的,以考虑到你删除项目会使其他项目向下移动的事实。
-
您可能需要考虑使用 StringBuffer 类。它将清理您的代码并避免必须逐个字符地显式复制您的输入字符串。