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
}
}