题解 | #扑克牌顺子#
扑克牌顺子
http://www.nowcoder.com/practice/762836f4d43d43ca9deb273b3de8e1f4
第六十二题 模拟第二题
方法一 排序 ,复杂度就是nlogn了
python直接sort排序之后塞入数字
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可#
#
# @param numbers int整型一维数组
# @return bool布尔型
#
class Solution:
def IsContinuous(self , numbers: List[int]) -> bool:
# write code here
# 排序
numbers.sort()
renyi=0
# 统计任意牌的个数
for i in numbers:
if i==0:
renyi+=1
else:
break
# 现在知道有多少个任意牌,后面遍历,如果缺了,就塞入相差的个数比如说7-4 则插入56 两张
last=numbers[renyi]
for i in numbers[renyi+1:]:
if i==last:
return False
if i-last!=1:
renyi-=(i-last-1)
last=i
if renyi<0:
return False
return True
方法二 因为数字是有大小范围的 所以不用排序的函数 只要遍历一次就可以“排序”
class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
// O(n)的方法,就说明不能排序
// 因为牌的大小是有范围的,所以可以利用数组来一次遍历就排序
int zero=0;
int a[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// 一次遍历,统计出0的个数 以及将数字统计到数组中,如果说 数组中出现过这个数字,则直接return false
for(int i=0;i<numbers.size();i++)
{
if(numbers[i]==0)
zero++;
else
{
if(a[numbers[i]]==0)
a[numbers[i]]=1;
else
return false;
}
}
// 遍历判断是否符合要求
int sum=0;
int i=0;
// 首先遍历到第一个不是0的位置,表示从此开始,后面5个必须是顺子
while(a[i]==0)
i++;
// 除去第一个位置 向后遍历四次
while(sum<4)
{
sum++;
i++;
// 如果说位置空了,但是有万能牌,万能牌来替代
// 如果位置空,但是没有万能牌,return false
if(a[i]==0 && zero>0)
zero--;
else if(a[i]==0 && zero<=0)
return false;
}
// 遍历结束 return true
return true;
}
};
public:
bool IsContinuous( vector<int> numbers ) {
// O(n)的方法,就说明不能排序
// 因为牌的大小是有范围的,所以可以利用数组来一次遍历就排序
int zero=0;
int a[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// 一次遍历,统计出0的个数 以及将数字统计到数组中,如果说 数组中出现过这个数字,则直接return false
for(int i=0;i<numbers.size();i++)
{
if(numbers[i]==0)
zero++;
else
{
if(a[numbers[i]]==0)
a[numbers[i]]=1;
else
return false;
}
}
// 遍历判断是否符合要求
int sum=0;
int i=0;
// 首先遍历到第一个不是0的位置,表示从此开始,后面5个必须是顺子
while(a[i]==0)
i++;
// 除去第一个位置 向后遍历四次
while(sum<4)
{
sum++;
i++;
// 如果说位置空了,但是有万能牌,万能牌来替代
// 如果位置空,但是没有万能牌,return false
if(a[i]==0 && zero>0)
zero--;
else if(a[i]==0 && zero<=0)
return false;
}
// 遍历结束 return true
return true;
}
};
题解 文章被收录于专栏
一遍做剑指offer 一边保存做题步骤 并附带详细注释哦