1. 程式人生 > >LeetCode 解題筆記——有效的數獨

LeetCode 解題筆記——有效的數獨

題目描述:判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

  1. 數字 1-9 在每一行只能出現一次。
  2. 數字 1-9 在每一列只能出現一次。
  3. 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。

解題思路:

按順序判斷這三個條件即可,一旦判斷為無效,直接返回False

具體方法:

在判斷行內是否有效時,先將str轉換為int,注意碰到 '.' 時不轉

for i in range(9):
            board1[i] = [int(x) for x in board1[i] if x != "."] #將字串轉為int,字元'.'將丟棄

這樣就將每行的數字提取出來了。之後將列表轉為集合,再比較集合與列表的長度,如果長度相同,則說明這一行不存在重複數字;如果長度不同,說明有重複數字,就可以返回False了

在判斷列內是否有效時,需要先用zip函式轉置一下,之後處理流程和行的處理流程相同

判斷每個小的3*3的格子是否有效時,需要先將每個小格拼成一個列表,再去判斷。

每次判斷的方法都是一樣的,區別是前期的處理,行不需處理,列需要轉置,小格需要拼接。當所有的判斷都通過時,返回True。

第一個版本寫得很差,很多程式碼重複的地方可以寫成函式,第二次寫的時候改進一下就好。

 # 0. 判斷每行是否符合要求。
        board1 = board.copy()
        for i in range(9):
            board1[i] = [int(x) for x in board1[i] if x != "."] #將字串轉為int,字元'.'將丟失
        j = 0
        while j<9 :
            board1_set = set(board1[j])
            if len(board1_set) ==len(board1[j]) :
                j +=1
            else:
                return False

        # 1. 判斷每列是否符合要求
        
        col = list(zip(board[0], board[1], board[2], board[3], board[4], board[5], board[6], board[7],board[8]))
        for x in col:
            x = list(x)
        for i in range(9):
            col[i] = [int(x) for x in col[i] if x != "."] #將字串轉為int,字元'.'將丟失
        j = 0
        while j<9 :
            board1_set = set(col[j])
            if len(board1_set) == len(col[j]):
                j +=1
            else:
                return False
        # 2. 判斷每個九宮格是否符合要求
        board3 = []
        for i in range(0, 9, 3):
            for j in range(0, 9, 3):
                fx = board[i][j:j+3]+board[i+1][j:j+3]+board[i+2][j:j+3]
                board3.append(fx) #每個九宮格是一個小列表
        
        for i in range(9):
            board3[i] = [int(x) for x in board3[i] if x != "."] #將字串轉為int,字元'.'將丟失
        j = 0
        while j<9 :
            board1_set = set(board3[j])
            if len(board1_set) == len(board3[j]):
                j +=1
            else:
                return False
        return True