leetcode 37. 搜索插入位置 38. 有效的数独

leetcode 37. 搜索插入位置 38. 有效的数独

37. 解数独

难度困难945收藏分享切换为英文接收动态反馈

编写一个程序,通过填充空格来解决数独问题。

数独的解法需 遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)

数独部分空格内已填入了数字,空白格用 '.' 表示。

示例:

img

输入:board = [["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"]]
输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

提示:

  • board.length == 9
  • board[i].length == 9
  • board[i][j] 是一位数字或者 '.'
  • 题目数据 保证 输入数独仅有一个解

通过次数98,547

提交次数147,009

# -*- coding: utf-8 -*-
import copy
from typing import List
import imghdr

class Solution:

    def solveSudoku(self, board: List[List[str]]) -> None:
        def dfs(pos:int):
            nonlocal valid
            #如果space查完了 返回
            if pos == len(space):
                valid = True
                return
            x,y = space[pos]
            for i in range(0,9):
                if row[x][i] == col[y][i] == bevel[x//3][y//3][i] == False:
                    row[x][i] = col[y][i] = bevel[x // 3][y // 3][i] = True
                    board[x][y] = str(i + 1)
                    dfs(pos+1)
                    row[x][i] = col[y][i] = bevel[x // 3][y // 3][i] = False
                if valid:
                    return
            #param pos 空位置的坐标
            pass
        #创建行 列 宫格 False是。 用来存1-9
        col = [[False] * 9 for _ in range(0,9)]
        row = [[False] * 9 for _ in range(0,9)]
        bevel = [[[False] * 9 for _b in range(0, 3)] for _a in range(0, 3)]
        valid = False
        #用来存是.的 xy
        space = list()

        for i in range(0,9):
            for i2 in range(0,9):
                if board[i][i2] == ".":
                    space.append((i,i2))
                else:
                    # ==true的代表 存在的值
                    dis = int(board[i][i2]) - 1
                    col[i2][dis] = row[i][dis] = bevel[i//3][i2//3][dis] = True
        #从第0个.的位置开始查找
        dfs(0)

    
    def solveSudoku(self, board: List[List[str]]) -> None:
        def flip(i: int, j: int, digit: int):
            line[i] ^= (1 << digit)
            column[j] ^= (1 << digit)
            block[i // 3][j // 3] ^= (1 << digit)

        def dfs(pos: int):
            nonlocal valid
            if pos == len(spaces):
                valid = True
                return

            i, j = spaces[pos]
            mask = ~(line[i] | column[j] | block[i // 3][j // 3]) & 0x1ff
            while mask:
                digitMask = mask & (-mask)
                digit = bin(digitMask).count("0") - 1
                flip(i, j, digit)
                board[i][j] = str(digit + 1)
                dfs(pos + 1)
                flip(i, j, digit)
                mask &= (mask - 1)
                if valid:
                    return

        line = [0] * 9
        column = [0] * 9
        block = [[0] * 3 for _ in range(3)]
        valid = False
        spaces = list()

        for i in range(9):
            for j in range(9):
                if board[i][j] == ".":
                    spaces.append((i, j))
                else:
                    digit = int(board[i][j]) - 1
                    flip(i, j, digit)

        dfs(0)


if __name__ == '__main__':
    board = [["5", "3", "1", "2", "7", "6", "8", "9", "4"]
           , ["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"]]

    board = [["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"]]

    b = [["5", "3", "4", "6", "7", "8", "9", "1", "2"], ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
        ["1", "9", "8", "3", "4", "2", "5", "6", "7"], ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
        ["4", "2", "6", "8", "5", "3", "7", "9", "1"], ["7", "1", "3", "9", "2", "4", "8", "5", "6"],
        ["9", "6", "1", "5", "3", "7", "2", "8", "4"], ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
        ["3", "4", "5", "2", "8", "6", "1", "7", "9"]]
    print(Solution().solveSudoku(board))
    # a = 0
    # a ^= (1 << 4)
    # print(a)
    # print(False == False == False)
38. 外观数列

难度中等743收藏分享切换为英文接收动态反馈

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

  • countAndSay(1) = "1"
  • countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1 
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 "3322251" 的描述如下图:

img

示例 1:

输入:n = 1
输出:"1"
解释:这是一个基本样例。

示例 2:

输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) = 读 "1" = 一 个 1 = "11"
countAndSay(3) = 读 "11" = 二 个 1 = "21"
countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"

提示:

  • 1 <= n <= 30
class Solution:
    def countAndSay(self, n: int) -> str:
        s = "1"
        for _ in range(n - 1):
            j = 0
            res = ""
            for i in range(1,len(s) + 1):
                if len(s) == i or s[i] != s[i - 1]:
                    res += str(i - j) + s[i - 1]
                    j = i
            s = res
        return s

    def countAndSay3(self, n: int) -> str:
        def getAns(n,s:str):
            length = len(s)
            if n <= 0:
                return s
            ans = ""
            a = s[0]
            for i in range(1, length):
                if a[0] == s[i]:
                    a += s[i]
                else:
                    ans += str(len(a)) + a[0]
                    a = s[i]
            ans += str(len(a)) + a[0]
            return getAns(n-1, ans)
        ans = "1"
        if n == 1:
            return ans
        ans += "1"
        n -= 2
        return getAns(n, ans)

    def countAndSay2(self, n: int) -> str:
        def get_ans(s: str):
            length = len(s)
            a = s[0]
            ans = ""
            for i in range(1, length):
                if a[0] == s[i]:
                    a += s[i]
                else:
                    ans += str(len(a)) + a[0]
                    a = s[i]
            if a != "":
                ans += str(len(a)) + a[0]
            return ans
        if n == 1:
            return "1"
        elif n == 2:
            return "11"
        elif n == 3:
            return "21"
        elif n == 4:
            return "1211"
        elif n == 5:
            return "111221"
        ans = "111221"
        for i in range(n-5):
            ans = get_ans(ans)
        return ans

if __name__ == '__main__':
    print(Solution().countAndSay(6))
       return "21"
        elif n == 4:
            return "1211"
        elif n == 5:
            return "111221"
        ans = "111221"
        for i in range(n-5):
            ans = get_ans(ans)
        return ans

if __name__ == '__main__':
    print(Solution().countAndSay(6))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matianlongg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值