牛客網在線編程專題《劍指offer-面試題44》撲克牌順子

我的個人微信公衆號:Microstrong

微信公衆號ID:MicrostrongAI

微信公衆號介紹:Microstrong(小強)同學主要研究機器學習、深度學習、計算機視覺、智能對話系統相關內容,分享在學習過程中的讀書筆記!期待您的關注,歡迎一起學習交流進步!

知乎主頁:https://www.zhihu.com/people/MicrostrongAI/activities

Github:https://github.com/Microstrong0305

個人博客:https://blog.csdn.net/program_developer

 題目鏈接:

https://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4

題目描述:

解題思路:

(1)暴力解法,考慮每種情況

已經AC的代碼:

class Solution:
    def IsContinuous(self, numbers):
        if numbers is None or len(numbers) < 5:
            return False

        new_numbers = sorted(numbers)
        count_zero = new_numbers.count(0)

        if count_zero == 0:
            if self.isContinueNum(new_numbers):
                return True
            else:
                return False
        if count_zero == 1:
            # 從第1位到最後1位是連續子序列
            if self.isContinueNum(new_numbers[1:]):
                return True
            # 中間有缺失1個數字
            elif self.fillOne(new_numbers[1:]):
                return True
            else:
                return False
        if count_zero == 2:
            # 從第2位到最後1位是連續子序列
            if self.isContinueNum(new_numbers[2:]):
                return True
            # 中間有缺失1個數字
            elif self.fillOne(new_numbers[2:]):
                return True
            # 中間缺失2個數字
            elif self.fillTwo(new_numbers[2:]):
                return True
            else:
                return False

        if count_zero == 3:
            # 從第3位到最後1位是連續子序列
            if self.isContinueNum(new_numbers[3:]):
                return True
            # 中間有缺失1個數字
            elif self.fillOne(new_numbers[3:]):
                return True
            # 中間缺失2個數字
            elif self.fillTwo(new_numbers[3:]):
                return True
            # 中間缺失3個數字
            elif self.fillThree(new_numbers[3:]):
                return True
            else:
                return False
        if count_zero >= 3:
            return True

    # 判斷一個序列是否是連續的數字
    def isContinueNum(self, numbers):
        count = 0
        for i in range(1, len(numbers), 1):
            if numbers[i] - numbers[i - 1] == 1:
                count += 1

        if count == len(numbers) - 1:
            return True
        else:
            return False

    # 填充一個數字能否滿足連續序列
    def fillOne(self, numbers):
        for i in range(1, len(numbers), 1):
            if numbers[i] - numbers[i - 1] != 1:
                numbers.insert(i, numbers[i - 1] + 1)
                break

        if self.isContinueNum(numbers):
            return True
        else:
            return False

    # 填充2個數字能否滿足連續序列
    def fillTwo(self, numbers):
        count = 0
        for i in range(1, len(numbers) + 2, 1):
            if numbers[i] - numbers[i - 1] != 1:
                if count < 2:
                    numbers.insert(i, numbers[i - 1] + 1)
                    count += 1
                else:
                    break

        if self.isContinueNum(numbers):
            return True
        else:
            return False

    # 填充3個數字能否滿足連續序列
    def fillThree(self, numbers):
        count = 0
        for i in range(1, len(numbers) + 3, 1):
            if numbers[i] - numbers[i - 1] != 1:
                if count < 3:
                    numbers.insert(i, numbers[i - 1] + 1)
                    count += 1
                else:
                    break

        if self.isContinueNum(numbers):
            return True
        else:
            return False

(2)統計缺失的數字個數是否等於大小王的個數

已經AC的代碼:

# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if numbers == None or len(numbers) < 5:
            return False

        numbers.sort()

        zero_count = numbers.count(0)

        if zero_count >= 4:
            return True

        if zero_count > 0:
            numbers = list(filter(lambda x: x != 0, numbers))

        absent_list = self.IsSeries(numbers)

        if zero_count == len(absent_list):
            return True
        else:
            return False

    def IsSeries(self, array):
        absent_list = []
        tempList = list(range(array[0], array[-1] + 1))
        for index, item in enumerate(tempList):
            if item not in array:
                absent_list.append(item)
        return absent_list

(3)《劍指offer》中解題方法

已經AC的代碼:

# -*- coding:utf-8 -*-
class Solution:
    def IsContinuous(self, numbers):
        # write code here
        if not numbers or len(numbers) < 1:
            return False

        numbers.sort()

        # 統計數組中0的個數
        numberOfZero = numbers.count(0)
        numberOfGap = 0

        # 統計數組中的間隔數目
        small = numberOfZero
        big = small + 1
        while big < len(numbers):
            # 兩個數相等,有對子,不可能是順子
            if numbers[small] == numbers[big]:
                return False
            numberOfGap += (numbers[big] - numbers[small] - 1)
            small = big
            big += 1

        return False if numberOfGap > numberOfZero else True

 

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