有效的数独-java

2024-03-29 16:04
文章标签 数独 java 有效

本文主要是介绍有效的数独-java,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 题目描述:

  • 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
    • 数字 1-9 在每一行只能出现一次。
    • 数字 1-9 在每一列只能出现一次。
    • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
    • 注意:

    • 一个有效的数独(部分已被填充)不一定是可解的。
    • 只需要根据以上规则,验证已经填入的数字是否有效即可。
    • 空白格用 '.' 表示。

 

  • 一, 解题思想 :
    • 这段代码是用来检查一个数独是否是合法的。它的思路是利用三个二维数组分别记录每一行、每一列和每个九宫格中除了'.'之外的数字出现的次数。

      1. 创建三个二维数组 `rows`, `columns`, `box`,分别用来记录每一行、每一列和每个九宫格中数字的出现次数。
      2. 使用两个嵌套的循环遍历整个数独表格。
      3. 对于每一个非'.'的数字,通过计算其在行、列和九宫格中的索引,更新相应的 `rows`, `columns`, `box` 数组中对应位置的计数器。
      4. 在更新计数器时,使用 `++` 操作符自增,同时检查是否出现重复数字,如果出现重复数字,则直接返回 `false`,表示该数独不合法。
      5. 如果遍历完成没有发现重复数字,则返回 `true`,表示该数独是合法的。

      这个算法的时间复杂度为 O(n^2),其中 n 是数独的边长。因为它只需要一次遍历整个数独表格,并且在每次遍历时只需要常数时间来更新计数器。

    • 二, 解题步骤:
      • 初始化数组:
        •  创建三个二维数组 rowscolumnsbox用来记录每一行、每一列和每个九宫格中数字的出现次数。,每个数组的初始值都是 0。
      • 遍历数独表格: 
        • 使用两个嵌套的循环遍历整个数独表格。外层循环控制行,内层循环控制列

      • 更新计数器: 
        • 对于每一个非'.'的数字,即非空格的情况,计算其在行、列和九宫格中的索引,并更新相应的 rowscolumnsbox 数组中对应位置的计数器。这里要注意的是,由于数组索引从0开始,需要将数字减去 '1' 来得到相应的索引值。例如,数字 '1' 对应的索引是 0,数字 '2' 对应的索引是 1,以此类推。

          • for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {int digit = board[i][j] - '1';}}}

      • 检查重复数字:

        •  在更新计数器时,使用 ++ 操作符自增,同时检查是否出现重复数字。具体做法是将当前位置对应的 rowscolumnsbox 数组中的值相乘,如果结果大于 1,说明当前位置的数字在该行、列或九宫格中已经出现过,即存在重复数字,此时直接返回 false,表示该数独不合法。

        • if(++rows[i][digit] * ++columns[j][digit] * ++box[i / 3][j / 3][digit] > 1)return false;
        • 返回结果:

          •  如果遍历完成没有发现重复数字,则返回 true,表示该数独是合法的。

      • 这个算法的关键在于通过三个数组分别记录每一行、每一列和每个九宫格中数字的出现次数,并在遍历过程中实时更新这些计数器,以便及时检查是否存在重复数字。

    • 以下是完整的代码 : (已在力扣通过, 运行时间 : 1ms, 消耗内存分布: 43.17MB)

  • class Solution {public boolean isValidSudoku(char[][] board) {int[][] rows = new int[9][9]; //  记录每一行中除0外的数字的次数int[][] columns = new int[9][9]; //  记录每一列中除0外的数字的次数int[][][] box = new int[3][3][9]; //  记录每个九宫格中除0外的数字的次数for (int i = 0; i < 9; i++) {for (int j = 0; j < 9; j++) {if (board[i][j] != '.') {int digit = board[i][j] - '1';if(++rows[i][digit] * ++columns[j][digit] * ++box[i / 3][j / 3][digit] > 1)return false;}}}return true;}
    }

        

  •                 以上是本篇博客的全部内容,感谢观看.

这篇关于有效的数独-java的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/859023

相关文章

【ZZULIOJ】1083: 数值统计(多实例测试)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 统计给定的n个数中,负数、零和正数的个数 输入 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的个数,然后是n个实数;如果n=0,则表示输入结束,该行不做处理。 输出 对于每组输入数据,输出一行a,b和c,分别表示给定的数据中负数、零和正数的

Spring源码深度解析:三级缓存机制探究

在Spring框架中,三级缓存机制是容器初始化Bean过程中的一个重要组成部分。它有效地解决了循环依赖的问题,特别是在单例Bean的初始化过程中。本文将深入探讨Spring的三级缓存机制,并通过代码片段来解析其工作原理。 一、三级缓存概述 Spring的三级缓存是为了解决循环依赖问题而设计的。在Spring的IoC容器中,Bean的创建和初始化过程分为多个阶段,其中涉及到了多个缓存。这三个缓存

SpringBoot整合RabbitMQ direct交换机、fanout交换机、topic交换机

PS 常见错误 1、有匹配到交换机,但是没有匹配到绑定的队列。(交换机没有绑定队列)- not route 2、没有匹配到交换机。(交换机名称错误,not found - exchange) 3、交换机和队列都没有匹配(和第二种状态一样,没有匹配到交换机,直接返回。) 本篇主要讲的是 直连交换机(amq.direct)、 扇形交换机(amq.fanout)、 主题交换机(amq.topic)。

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录界面图,管理员登录进入口腔管理平台可以查看首页、个人中心、会员管理、病例就诊信息管理、牙齿保健产品管理、复查提醒管理、预约挂号管理、药品信息管理、 留言板管理、系统

【第22章】spring-计时器

文章目录 前言一、java计时1. 计时代码2. 执行结果 二、spring计时1.计时代码2.执行结果 总结 前言 功能优化的重点是需要缩短业务中比较耗时的模块的处理时间,首先我们需要分析出各个模块的耗时时间,接下来才能有针对的去做优化。 Spring 框架提供了一个 StopWatch 类,它用于在开发过程中测量代码执行时间。通过 StopWatch,你可以方便地记录多

java工程从window移植到Linux系统

java是跨平台的编程语言,只要安装了jvm 就可以运行java程序。但是window和Linux系统还是有些不同的地方 我们的项目目录:Project Main文件夹存储的是我们的算法主程序 Lib文件存储的是通用的类库文件 例子: 运行jmetal.metaheuristics.nnia6fortest 文件结构 Package jmetal.metah

Java面试八股文-2024

面试指南 TMD,一个后端为什么要了解那么多的知识,真是服了。啥啥都得了解 MySQL MySQL索引可能在以下几种情况下失效: 不遵循最左匹配原则:在联合索引中,如果没有使用索引的最左前缀,即查询条件中没有包含联合索引的第一列,那么索引将会失效。使用了OR操作符:即使在查询条件中使用了联合索引的全部列,如果这些列之间是使用OR操作符连接的,索引也可能会失效。数据类型转换:如果在

Java之复制图片

从文件夹中复制图片 从这个文件夹: 复制到这个空的文件夹: 代码如下: import java.io.*;import java.util.Scanner;/*** 普通文件的复制*/public class TestDome10 {public static void main(String[] args) {// 输入两个路径// 从哪里(源路径)拷贝到哪里(目标路径)Sc

基于springboot实现企业级工位管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现企业级工位管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了企业级工位管理系统的开发全过程。通过分析企业级工位管理系统管理的不足,创建了一个计算机管理企业级工位管理系统的方案。文章介绍了企业级工位管理系统的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本企业级

Java苍穹外卖02-公共字段自动填充-菜品管理

一、公共字段自动填充 1.问题分析 需要有一种手段能够在mapper层(持久层)知道当前操作是否是insert或者update。 为mapper中需要进行拦截的方法加注解,然后去为这些赋值 2.代码开发 注解创建: 注意这里的Retention注解一定要是RUNTIME不然进入不了切面,设置value为OperationType枚举,规定这个注解只能是对INSERT和UP