每天一題LeetCode【第27天】

T36. Valid Sudoku【Medium

題目

這是一道數(shù)獨(dú)題,如何確定數(shù)獨(dú)有效,參考 數(shù)獨(dú)規(guī)則

數(shù)獨(dú)板可以是部分填充的,其中空單元填充字符'.'。

以上是一個(gè)部分填充了的有效的數(shù)獨(dú)游戲。

注意:

有效的 數(shù)獨(dú)游戲 板(部分填充)不一定可解。需要驗(yàn)證的只有已經(jīng)填充的單元格。

思路

首先,審題,不用算是否可解,那題目一下子就變得簡(jiǎn)單了起來(lái),這時(shí)候就是理解規(guī)則并且按規(guī)則來(lái)判斷就可以了。

總的來(lái)說(shuō),要判斷三個(gè)方面:

① 同行有沒(méi)有重復(fù)

② 同列有沒(méi)有重復(fù)

③ 同九宮格有沒(méi)有重復(fù)

(不知道為什么的看數(shù)獨(dú)規(guī)則哈:))

代碼很巧妙,

① 通過(guò) 給數(shù)字編碼(加標(biāo)簽)來(lái)限定范圍

② 依靠了 HashSet 來(lái)判斷重復(fù)

編碼方式:

  • 第 7 行的數(shù)字 '4' 編碼以后是 "(4)7"
  • 第 7 列的數(shù)字 '4' 編碼以后是 "7(4)"
  • 右上方九宮格(第 1 行 第 3 列)的數(shù)字 '4' 編碼以后是 "0(4)2"

具體看代碼以及注釋~

代碼

代碼取自 Top Solution,稍作注釋

public boolean isValidSudoku(char[][] board) {
    Set seen = new HashSet();
    for (int i=0; i<9; ++i) {
        for (int j=0; j<9; ++j) {
            if (board[i][j] != '.') {
                //給數(shù)字加()
                String b = "(" + board[i][j] + ")";
                //先編碼再加入數(shù)組,然后若重復(fù),則 add() 方法返回false,然后進(jìn)入 if,return false
                if (!seen.add(b + i) || !seen.add(j + b) || !seen.add(i/3 + b + j/3))
                    return false;
            }
        }
    }
    return true;
}

補(bǔ)充

① 先補(bǔ)充一下 HashSet 的 add() 方法:

public boolean add(Object o)方法用來(lái)在Set中添加元素,當(dāng)元素值重復(fù)時(shí)則會(huì)立即返回false,如果成功添加的話會(huì)返回true。

② 然后總結(jié)收獲 (*?????)?。

這題讓我學(xué)到了:

  • 判斷是否重復(fù)可以用 HashSet 的 add() 方法的返回值來(lái)判斷。

  • 同時(shí),自己制定規(guī)則通過(guò)給 String 加上特定編碼也是一種簡(jiǎn)單好用的分類(lèi)方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,765評(píng)論 18 399
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,771評(píng)論 0 33
  • 1.import static是Java 5增加的功能,就是將Import類(lèi)中的靜態(tài)方法,可以作為本類(lèi)的靜態(tài)方法來(lái)...
    XLsn0w閱讀 1,263評(píng)論 0 2
  • 面向?qū)ο笾饕槍?duì)面向過(guò)程。 面向過(guò)程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬(wàn)物...
    sinpi閱讀 1,091評(píng)論 0 4
  • 我們的思維變成了亞里士多德模式,強(qiáng)調(diào)通過(guò)表面現(xiàn)象洞察隱藏在物質(zhì)世界背后的抽象本質(zhì)。 &也有好多大衛(wèi)科波菲爾模式的思...
    姚大刀閱讀 242評(píng)論 0 0