【算法練習20190802】

1、推理題

抓了A,B,C,D四名犯罪嫌疑人,其中有一人是小偷,審訊中:

A:我不是小偷;

B:C是小偷;

C:小偷肯定是D;

D:C胡說!

其中有三個人說的是實話,一個人說的是假話,請編程推斷誰是小偷(用窮舉法和邏輯表達式)。

 

[1]分析:可以遍歷假設某個人是小偷,然後驗證。

[2]代碼

'''第i個人是假話'''
'''i=1的話假設A是小偷'''
for i in range(4):
    i += 1
    print(i)
    if 3 == ((i != 1) + (i == 3) + (i == 4) + (i != 4)):
        str = chr(96 + i) + "是小偷"
        print(str)

2、有效的數獨

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

數字 1-9 在每一行只能出現一次。

數字 1-9 在每一列只能出現一次。

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

[1]分析:用三個二維數組來保存行、列、粗線宮,一次遍歷數獨即可判斷是否有重複。

[2]代碼

class Solution(object):
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        rows = [[] for _ in range(9)]
        columns = [[] for _ in range(9)]
        boxes = [[] for _ in range(9)]
        for i in range(9):
            for j in range(9):
                num = board[i][j]
                box_index = (i // 3) * 3 + j // 3 #判斷在第幾個粗線宮
                if num != '.':
                    if num in rows[i] or num in columns[j] or num in boxes[box_index]:#判斷行、列、粗線宮是否重複
                        return False
                    else:
                        rows[i].append(num)
                        columns[j].append(num)
                        boxes[box_index].append(num)
        return True
a = [
  ["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(Solution().isValidSudoku(a))

3、旋轉圖像

給定一個 n × n 的二維矩陣表示一個圖像。將圖像順時針旋轉 90 度。說明:你必須在原地旋轉圖像,這意味着你需要直接修改輸入的二維矩陣。請不要使用另一個矩陣來旋轉圖像。

[分析]馬上想到zip轉置函數zip(*matrix)。順時針即轉置後每一個元素倒置。

[代碼]

def rotate(matrix):
    """
    :type matrix: List[List[int]]
    :rtype: void Do not return anything, modify matrix in-place instead.
    """
    matrix[:] = [list(x[::-1]) for x in zip(*matrix)]#轉置後每個元素內部倒置
matrix = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
]
rotate(matrix)
print(matrix)

 

4、批量處理一個文件夾下的圖象

(1)對圖象進行中值濾波,保存濾波結果

(2)對圖象進行直方圖均衡化(即灰度拉伸)

(3)根據圖像特徵,找閾值,提取ROI(感興趣區域)

(4)提取當前文件夾下所有文件名,並寫入到excel中

5、列表

(1)創建一個包含1-100之間所有素數的列表,打印顯示該列表;

(2)隨後只保留該列表前5個數字,刪除其餘內容並打印輸出相應結果;

(3)再將每個元素值加上100,顯示列表內容。

6、輸入某年某月某日,判斷這一天是這一年的第幾天?

7、有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。

8、給定一個沒有重複數字的序列,返回其所有可能的全排列。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章