zoukankan      html  css  js  c++  java
  • 乘风破浪: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中点号的数值和数字的数值。

  • 相关阅读:
    iperf/iperf3网络测试工具的安装与使用
    驱动模块(4)——模块编译
    760. Find Anagram Mappings
    MySQL面试题
    MySQL 的数据存储引擎
    203. Remove Linked List Elements
    数据库事务隔离级别
    232. Implement Queue using Stacks
    MySQL中的事务
    482. License Key Formatting
  • 原文地址:https://www.cnblogs.com/zyrblog/p/10224429.html
Copyright © 2011-2022 走看看