乘風破浪:LeetCode真題_036_Valid Sudoku

乘風破浪:LeetCode真題_036_Valid Sudoku

1、前言

   有的時候對於一些基礎知識的掌握,對咱們是相當重要的,好比ASCII重要字符的表示,好比一些基本類型的長度。java

2、Valid Sudoku

2.1 問題

2.2 分析與解決

   這樣的問題能夠說是比較簡單了,咱們只須要簡單的按照規則進行檢測就能獲得相應的結果了,可是有沒有更好一點的方法呢?我想應該是沒有了。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;
    }
}

3、總結

   這道題不難,重要的在於咱們記得ASCII中點號的數值和數字的數值。3d

相關文章
相關標籤/搜索