乘风破浪:LeetCode真题_036_Valid Sudoku
乘风破浪:LeetCode真题_036_Valid Sudoku
一、前言
有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度。
二、Valid Sudoku
2.1 问题
2.2 分析与解决
这样的问题可以说是比较简单了,我们只需要简单的按照规则进行检测就能得到相应的结果了,但是有没有更好一点的方法呢?我想应该是没有了。
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中点号的数值和数字的数值。