zoukankan      html  css  js  c++  java
  • 36.有效的数独

    2020-06-17
    有效的数独
    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可
    • 数字 1-9 在每一行只能出现一次。
    • 数字 1-9 在每一列只能出现一次。
    • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

    上图是一个部分填充的有效的数独。

    数独部分空格内已填入了数字,空白格用 '.' 表示。

    说明
    • 一个有效的数独(部分已被填充)不一定是可解的。
    • 只需要根据以上规则,验证已经填入的数字是否有效即可。
    • 给定数独序列只包含数字 1-9 和字符 '.' 。
    • 给定数独永远是 9x9 形式的。
    题解:
    思路1:哈希表
    var isValidSudoku = function (board) {
      let hash1 = new Array(9), // 3个hash表分别对应每一行 每一列 每一格
        hash2 = new Array(9), // 千万别用fill({}) fill出来的是同一个对象~~~~
        hash3 = new Array(9),
        tmp, i3; // tmp当前遍历项的值  i3 是hash3对应的第几个方格
      for (let i = 0; i < board.length; i++) {
        hash1[i] = {}; // i表示每一行 每次进入新的一行 hash1[i] 赋值为空对象
        for (let j = 0; j < board.length; j++) {
          if (i === 0) hash2[j] = {}; // 当 i = 0 时 hash2 每一列都没有赋值 为每一列赋值空对象
          tmp = board[i][j];
          if (tmp === '.') continue; // 空则继续
    
          if (!hash1[i][tmp]) hash1[i][tmp] = 1; // 如果第i行还没出现过这个值 赋值1
          else return false; // 如果出现过 说明一行出现两个相同值 return false
    
          if (!hash2[j][tmp]) hash2[j][tmp] = 1; // 如果第j列没出现过这个值 赋值1
          else return false; // 如果出现过 说明一列出现两个相同值 return false
    
          i3 = Math.floor(i / 3) * 3 + Math.floor(j / 3); // i3计算当前i j对应的是第几个小方格
          if (!hash3[i3]) hash3[i3] = {};
          if (!hash3[i3][tmp]) hash3[i3][tmp] = 1; // 如果当前方格没有出现过该值 赋值1
          else return false; // 同理
        }
      }
      return true; // 遍历结束后都没触发过return false 说明是有效的数独
    };
     
  • 相关阅读:
    印度软件外包合作有感
    BAT 技术团队博客
    Android 腾讯入门教程( 智能手表UI设计 和 MVC模式 )
    Android 开源项目及其学习
    Android android:allowBackup waiting for backup
    同步计数器 CountDownLatch
    Android 性能优化之使用Lint
    Android SQLite数据库升级,怎么做(事物更改)
    Google FireBase
    Android Keystore 对称-非对称加密
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/13150804.html
Copyright © 2011-2022 走看看