我正在解决LeetCode上的N皇后问题,该问题规定主方法的返回类型为
List<List<String>>
。我想如果我创建一个全局变量作为List<List<String>>
,然后在主方法中将其实例化为ArrayList<ArrayList<String>>
,我就能够以正确的类型返回,但当我尝试实例化时,会出现错误:“第12行:错误:不兼容的类型:ArrayList<ArrayList<StringBuilder>>
无法转换为ArrayList<ArrayList<String>>
”。
我曾认为,因为ArrayList实现了List,所以可以将ArrayList的实例作为List返回,但是当我将全局变量设置为ArrayList时,它会给出以下错误:“第15行:错误:不兼容的类型:ArrayList<ArrayList<String>>
无法转换为List<List<String>>
”。打印出被视为有效的棋盘组合,我知道我得到了正确的组合,但是这个最后的细节真的让我很沮丧,我非常感谢任何关于为什么我会得到这些错误的解释。谢谢!
class Solution {
ArrayList<Integer> colsUsed;
ArrayList<Integer> leftDiagsUsed;
ArrayList<Integer> rightDiagsUsed;
ArrayList<ArrayList<String>> solutions;
public List<List<String>> solveNQueens(int n) {
colsUsed = new ArrayList<Integer>();
leftDiagsUsed = new ArrayList<Integer>();
rightDiagsUsed = new ArrayList<Integer>();
ArrayList<StringBuilder> board = createBoard(n);
solutions = new ArrayList<ArrayList<String>>();
return solutions;
}
public void iterateBoards(ArrayList<StringBuilder> board, int row, int n){
if (row >= n){
printBoard(board);
addBoard(board);
return;
}
for (int col = 0; col < n; col++){
if (!colsUsed.contains(col) && !leftDiagsUsed.contains(row - col) && !rightDiagsUsed.contains(row + col)){
colsUsed.add(col);
leftDiagsUsed.add(row - col);
rightDiagsUsed.add(row + col);
board.get(row).setCharAt(col, 'Q');
iterateBoards(board, row + 1, n);
colsUsed.remove(new Integer(col));
leftDiagsUsed.remove(new Integer(row - col));
rightDiagsUsed.remove(new Integer(row + col));
board.get(row).setCharAt(col, '.');
}
}
}
public ArrayList<StringBuilder> createBoard(int n){
StringBuilder row = new StringBuilder();
ArrayList<StringBuilder> board = new ArrayList<StringBuilder>(n);
for (int col = 0; col < n; col++){
row.append(".");
}
for (int currRow = 0; currRow < n; currRow++){
board.add(new StringBuilder(row.toString()));
}
return board;
}
public void addBoard(ArrayList<StringBuilder> board){
List<String> newBoard = new ArrayList<String>();
for (int i = 0; i < board.size(); i++){
newBoard.add(board.get(i).toString());
}
solutions.add(newBoard);
}
public void printBoard(ArrayList<StringBuilder> board){
for (int i = 0; i < board.size(); i++){
StringBuilder curr = board.get(i);
System.out.println(curr.toString());
}
System.out.println();
}
}