以下為我的天梯積分規則:
每日至少一題:一題積分+10分
若多做了一題(或多一種方法解答),則當日積分+20分(+10+10)
若做了三道以上,則從第三題開始算+20分(如:做了三道題則積分-10+10+20=40;做了四道題則積分–10+10+20+20=60)
初始分為100分
若差一天沒做題,則扣積分-10分(周六、周日除外注:休息)
堅持!!!
初級算法
刷題目錄
數組

題幹
請你判斷一個 9x9 的數獨是否有效。隻需要 根據以下規則 ,驗證已經填入的數字是否有效即可。
數字 1-9 在每一行隻能出現一次
數字 1-9 在每一列隻能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮内隻能出現一次。(請參考示例圖)
數獨部分空格内已填入了數字,空白格用 ‘.’ 表示。
注意:
一個有效的數獨(部分已被填充)不一定是可解的。
隻需要根據以上規則,驗證已經填入的數字是否有效即可。
示例1:
直接判斷法
分析:
我們需要查找再某行或某列及其3*3的宮内有無相同的數字,如果滿足條件,則傳回true;相反,則傳回false.
本題難度中等
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
res = True # 預設輸出True
# 判斷行
for i in range(len(board)):
dotCount = board[i].count('.') # 得到每一行中“.”的個數
rightCount = len(board[i]) - dotCount + 1 # 得到每一行中真實數字的數
judgeCount = len(set(board[i])) # 得到集合每一行的元素個數,由于set()會直接将多餘的或者說相同的數,記為一個數,如:6,6,4,6,3. 輸出得到的長度為3,而不是5,意思三個6,隻保留一個6;且會從小到大,排序
if rightCount != judgeCount: # 判斷兩者的長度是否一直,若不一直則指派FALSE
res = False
# 判斷列
for i in range(len(board[0])):
l = [] # 設定空數組存儲
for j in range(len(board)):
l.append(board[j][i]) # 将每列元素存入臨時數組中
dotCount = l.count('.') # 計算“.”的個數
rightCount = len(board[0]) - dotCount + 1 # 得到每一列中數字的個數
judgeCount = len(set(l)) # 得到集合l的長度
if rightCount != judgeCount:
res = False
# 判斷3*3宮内是否重複
for i in range(0, len(board), 3):
for j in range(0, len(board[0]), 3):
m = []
for k in range(i, i+3):
for z in range(j, j+3):
m.append(board[k][z])
dotCount = m.count('.')
rightCount = len(m) - dotCount + 1
judgeCount = len(set(m))
if rightCount != judgeCount:
res = False
return res