第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
第5章 优化时间和空间效率
面试题39 : 数组中出现次数超过一半的数字
面试题40 : 最小的k个数
面试题42 : 连续子数组的最大和
面试题43 : 从1到n整数中1出现的次数
面试题45 : 把数组排成最小的数
面试题49 : 丑数
面试题50 : 第一个只出现一次的字符
面试题51 : 数组中的逆序对
面试题52 : 两个链表的第一个公共结点
面试题53 : 在排序数组中查找数字
面试题55 : 二叉树的深度、平衡二叉树
面试题56 : 数组中数字出现的次数
面试题57 : 和为s的连续正数序列、和为s的数字
面试题58 : 翻转字符串、左旋转字符串
面试题61 : 扑克牌中的顺子
第6章 面试中的各项能力
第7章 两个面试案例
题目描述
牛客网
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10位数字本身,A为1,J为11,Q为12, K为13,你可以认为大小王就是数字0,大小王可以抵任意数字。
解题思路
解法一:
- 首先排序数组;
- 统计数组中0的个数;
- 统计排序后数组中相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么数组就是连续的,反之不连续。
实战
class Solution:
def IsContinuous(self, numbers):
# write code here
if not numbers:
return False
numbers.sort()
zeros = 0
pre = None
for num in numbers:
if num == 0:
zeros += 1
if not pre:
pre = num
elif num == pre:
return False
else:
diff = num - pre - 1
zeros -= diff
pre = num
if zeros < 0:
return False
return True
解法二:
统计数组中最大值和最小值,0的个数和非0数字的个数。如果最大值和最小值之间的空位可以被0和剩余非0数字填满,则数组是连续的,否则不连续。
实战
class Solution:
def IsContinuous(self, numbers):
# write code here
if not numbers:
return False
zeros, maxi, mini = 0, -1, 14
counts = 0
exist = set()
for num in numbers:
if num == 0:
zeros += 1
continue
if num in exist:
return False
if num > maxi:
maxi = num
if num < mini:
mini = num
counts += 1
exist.add(num)
return maxi - mini + 1 - counts <= zeros