Java ArrayIndexOutOfBoundsException-(36.Leetcode上的有效数独)
全部 我正在研究这个来自Leetcode的问题 如果有人想查看问题,请访问以下链接: 我想我几乎解决了这个问题,但是“java.lang.ArrayIndexOutOfBoundsException”有点问题,我在代码中使用大写注释来标记它,==>“if(brain[((int)board[x][y])-1])” 我检查了很多次,我认为通过执行“for(inti=0,I<9;I++)”,索引应该在0~8范围内非常好,但我找不到原因 我想这一定是一个简单愚蠢的问题,但我花了很多时间来找出答案。有人能帮我吗 非常感谢帮助我的人Java ArrayIndexOutOfBoundsException-(36.Leetcode上的有效数独),java,arrays,indexoutofboundsexception,Java,Arrays,Indexoutofboundsexception,全部 我正在研究这个来自Leetcode的问题 如果有人想查看问题,请访问以下链接: 我想我几乎解决了这个问题,但是“java.lang.ArrayIndexOutOfBoundsException”有点问题,我在代码中使用大写注释来标记它,==>“if(brain[((int)board[x][y])-1])” 我检查了很多次,我认为通过执行“for(inti=0,I
public class Solution {
public boolean isValidSudoku(char[][] board) {
if (board.length > 9 || board[0].length > 9 || board == null) {
return false;
}
boolean[] brain;
// 9 digits are corresponding to 1 ~ 9 ==> 0 - 1, 1 - 2 ... 8 - 9
// ex: brain[2] is checking for digit "3" , so using brain[3-1] to check "3"
for (int x = 0; x < board.length; x++) {
// Reset brain
brain = new boolean[9];
for (int y = 0; y < board[0].length; y++) {
if (board[x][y] != '.') {
// THE NEXT LINE IS THE PROBLEM!!!
if (brain[((int) board[x][y]) - 1]) {
// my condition failed by using:
// brain[board[x][y] - 1]
// other's condition Partially passed by using
// (still failed for final submission:
// brain[(int) (board[x][y] - '1')]
// need to compare the difference
return false;
} else {
brain[((int) board[x][y]) - 1] = true;
}
}
}
}
for (int x = 0; x < board.length; x++) {
// Reset brain
brain = new boolean[9];
for (int y = 0; y < board[0].length; y++) {
if (board[x][y] != '.') {
if (brain[((int) board[y][x]) - 1]) {
return false;
} else {
brain[((int) board[y][x]) - 1] = true;
}
}
}
}
for (int block = 0; block < 9; block++) {
// Reset brain
brain = new boolean[9];
for (int r = block / 3 * 3; r < block / 3 * 3 + 3; r++) {
for (int c = block % 3 * 3; c < block % 3 * 3 + 3; c++) {
if (board[r][c] != '.') {
if (brain[((int) board[r][c]) - 1]) {
return false;
} else {
brain[((int) board[r][c]) - 1] = true;
}
}
}
}
}
return true;
}
}
公共类解决方案{
公共布尔值isValidSudoku(字符[][]板){
如果(board.length>9 | | board[0]。length>9 | | board==null){
返回false;
}
布尔[]脑;
//9位数字对应于1~9==>0-1、1-2…8-9
//例:大脑[2]正在检查数字“3”,因此使用大脑[3-1]检查数字“3”
用于(int x=0;x
您正在尝试将字符转换为int
。尝试手动转换这些值,您会注意到0=48
和9=57
,我想这应该是您异常的原因
您可能需要检查其中的值是否代表一个数字,并使用Character\getNumericValue
方法获取字符的数值
if (Character.isDigit(board[x][y]) &&
brain[Character.getNumericValue(board[x][y])) - 1]) {
...
}
请不要对我们大喊大叫。:-@Kratos_Omega你确定棋盘[x][y]不能包含0吗?。Lol btw leriyou正在尝试将char
转换为int
。对于char
1
,它不会返回1
。我的猜测是,您正在尝试访问介于47-57
之间的某个索引,但这只能通过完整的stacktrace@Nadirboard
是一个char
数组,他将其转换为int
,因此,即使0
在那里,如果我没有读错的话,它应该是索引47
。@KevinEsche你是对的,它确实溢出了数组。谢谢大家,(int)是个问题,我忘了它实际上会获取字符的实际值,而不是数字值。好的,我使用KevinEsche的if语句再次尝试&也尝试我的新if语句,即“if(brain[board[x][y]-'1']]{…}”,但是同样的错误再次发生在第二个循环中。我会将凯文的回答标记为已完成,因为它确实指出了我的问题,并且仍然感谢所有帮助过我的人。但是,只要问一下是否有人知道第二个循环中可能会出现相同问题的原因,即使我添加了正确的索引(我相信我知道了)?好吧,我认为问题在于“.”,我没有正确地将其从计算中过滤掉,java.lang.ArrayIndexOutOfBoundsException返回“-3”,它表示“期间”参与计算-'1'。