我的個人微信公衆號:Microstrong
微信公衆號ID:MicrostrongAI
微信公衆號介紹:Microstrong(小強)同學主要研究機器學習、深度學習、計算機視覺、智能對話系統相關內容,分享在學習過程中的讀書筆記!期待您的關注,歡迎一起學習交流進步!
知乎主頁:https://www.zhihu.com/people/MicrostrongAI/activities
題目鏈接:
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