【LeetCode】36. Valid Sudoku 解题报告(Python)

本文介绍了一种使用Python实现的数独有效性验证算法。通过遍历数独的每一行、每一列以及每一个小格子,利用字典来检查数字是否重复,从而判断数独是否有效。文章详细解释了如何计算小格子的坐标,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目分析:

这一题比较简单,甚至我觉得有耐心可以不用循环写出来(滑稽),用循环就时取出每行、每列、每个小格子里非’.'的值,再判断是否有重复值即可,可以用set或者dict取判断,我觉得dict要简单一些,不存在就加进去,存在返回False。
在这里插入图片描述
关于行列没什么说的,而小格子的坐标有点难度,[int(i/3)*3 + int(j/3)]可以理解为第几个小格子,[int(i%3)*3 + int(j%3)]可以理解为小格子中的第几个元素,你可以写几个格子的坐标找一下这个规律。

测试代码:

class Solution:
    def isValidSudoku(self, board):
        for i in range(9):
            #分别储存一行,一列,一个小方格
            heng, shu, fang = {}, {}, {}
            for j in range(9):
                #行,首先排除'.'
                if board[i][j] != '.':
                    #不在则加入字典,在了就是重复返回False
                    if board[i][j] not in heng: heng.update({board[i][j]:0})
                    else:   return False
                #列,首先排除'.'
                if board[j][i] != '.':
                    # 不在则加入字典,在了就是重复返回False
                    if board[j][i] not in shu: shu.update({board[j][i]:0})
                    else:   return False
                #小方格,首先排除'.',[int(i/3)*3 + int(j/3)]可以理解为第几个小格子,[int(i%3)*3 + int(j%3)]可以理解为小格子中的第几个元素
                if board[int(i/3)*3 + int(j/3)][int(i%3)*3 + int(j%3)] != '.':
                    # 不在则加入字典,在了就是重复返回False
                    if board[int(i/3)*3 + int(j/3)][int(i%3)*3 + int(j%3)] not in fang: fang.update({board[int(i/3)*3 + int(j/3)][int(i%3)*3 + int(j%3)]:0})
                    else:   return False
        return True

print(Solution().isValidSudoku([
  ["5","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
])) #提交时请删除print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值