leetcode刷题笔记三十六 有效的数独

leetcode刷题笔记三十六 有效的数独

源地址:36. 有效的数独

问题描述:

判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次

知识补充:

本题主要是保证行、列、宫内无重复数据,说到重复数据,很容易让人联想到数据结集合或者hashmap等,这里补充一下Set与Hash Set的相关知识。

Set是一种最简单集合。集合中元素不按特定方式排序,且没有重复对象。Scala提供了两个子特质,一个用于不可变集合,一个用于可变集合。

一些常见的集合操作:

//定义集合
val aSet = Set(1,2,3,4)
val bSet = Set(5,6,7,8)
//集合拼接
val abSet = aSet + bSet

//定义HashSet
import scala.collection.mutable.HashSet
val cSet = new HashSet[Int]()
//添加
cSet += 1
cSet.add(2)
//删除
cSet -= 2
cSet.remove(1)
//不存在即添加
cSet.update(2,true)

代码补充:

//将位置与值结合成字符串,分别表示行、列、宫
//将他们插入HashSet,如果无法成功添加即说明已存在
import scala.collection.mutable.HashSet 
object Solution {
    def isValidSudoku(board: Array[Array[Char]]): Boolean = {
        val newSet = new HashSet[String]()
        for(i <- 0 until 9){
            for(j <- 0 until 9){
                if(board(i)(j) != '.'){
                    val iRow = "(" + i + ") " + board(i)(j)
                    val jcol = board(i)(j) + "(" + j + ") " 
                    val squarl = "(" + i/3 + "," + j/3 +") " + board(i)(j)
                    println("----------------------------------")
                    println("iRow: "+iRow)
                    println("jcol: "+jcol)
                    println("squarl: "+squarl)
                    if(!newSet.add(iRow) || !newSet.add(jcol) || !newSet.add(squarl)) return false
                }
            }
        }
        return true
    }
}
原文地址:https://www.cnblogs.com/ganshuoos/p/12878150.html