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

 

 

 

 

 

 

全部评论

相关推荐

想润的芹菜人狠话不多:把其中一个老总放中间都会得罪另一个
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务