有的時候對於一些基礎知識的掌握,對咱們是相當重要的,好比ASCII重要字符的表示,好比一些基本類型的長度。java
這樣的問題能夠說是比較簡單了,咱們只須要簡單的按照規則進行檢測就能獲得相應的結果了,可是有沒有更好一點的方法呢?我想應該是沒有了。spa
public class Solution { /** * 題目大意 * 驗證一個數獨棋盤是否合法,數獨棋盤的驗證規則見連接對應的頁面。 * 數獨棋盤是部分填滿的,空的位置使用點來代替。 * 注意:合法的棋盤不必定要求的可解的,只要填充的數字知足要求就能夠。 * * 解題思路 * 先對行進行檢查,再對列進行檢查,最後檢查3*3的方格。 */ public boolean isValidSudoku(char[][] board) { // .的ASCII值是46,0的ASCII值是48,/的ASCII值是47 int number = board[0].length; int[] record = new int[10 + 2]; //保存.到9的值,保存數據的位置在[3, 11] boolean isValid; reset(record); // 對行進行檢查 for (int i = 0; i < number; i++) { for (int j = 0; j < number; j++) { record[board[i][j] - '.']++; } if (!check(record)) { // 如是檢查失敗 return false; } else { // 檢查成功重置棋盤 reset(record); } } // 對列進行檢查 for (int i = 0; i < number; i++) { for (int j = 0; j < number; j++) { record[board[j][i] - '.']++; } if (!check(record)) { // 如是檢查失敗 return false; } else { // 檢查成功重置棋盤 reset(record); } } // 檢查3*3方塊 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { for (int k = i * 3; k < (i + 1) * 3; k++) { for (int l = j * 3; l < (j + 1) * 3; l++) { record[board[k][l] - '.']++; } } if (!check(record)) { // 如是檢查失敗 return false; } else { // 檢查成功重置棋盤 reset(record); } } } return true; } private void reset(int[] a) { for (int i = 0; i < a.length; i++) { a[i] = 0; } } /** * 檢查棋盤一行,一列,或者3*3的方格是否合法,若是1-9中的數字個數大於1就不合法 * * @param a 驗證數字 * @return 返回結果 */ private boolean check(int[] a) { for (int i = 3; i < a.length; i++) { if (a[i] > 1) { return false; } } return true; } }
這道題不難,重要的在於咱們記得ASCII中點號的數值和數字的數值。3d