笔试面试之扑克牌顺子

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A1J11Q12K13,而大小王可以看成任意数字。

  

方法一:1.排序,2.求出0个数 3.求出非0的牌之间的差距 如果差距小于等于0的个数那么即为顺子。时复o(nlogn+n) 

方法二:求出0个数,非0牌的最大值和最小值,max-min+N0 <= 5 ? 如果满足那么是顺子。中间加上重复的判断。时复o(n)

 

方法一:

bool IsContinuous(std::vector<int> numbers, int maxNumber)

{

    if(numbers.size() == 0 || maxNumber <=0)

        return false;

 

    // Sort the array numbers.

    std::sort(numbers.begin(), numbers.end());

 

    int numberOfZero = 0;

    int numberOfGap = 0;

 

    // how many 0s in the array?

    std::vector<int>::iterator smallerNumber = numbers.begin();

    while(smallerNumber != numbers.end() && *smallerNumber == 0)

    {

        numberOfZero++;

        ++smallerNumber;

    }

 

    // get the total gaps between all adjacent two numbers

    std::vector<int>::iterator biggerNumber = smallerNumber + 1;

    while(biggerNumber < numbers.end())

    {

        // if any non-zero number appears more than once in the array,

        // the array can't be continuous

        if(*biggerNumber == *smallerNumber)

            return false;

 

        numberOfGap += *biggerNumber - *smallerNumber - 1;

        smallerNumber = biggerNumber;

        ++biggerNumber;

    }

 

    return (numberOfGap > numberOfZero) ? false true;

}

转载自:http://zhedahht.blog.163.com/blog/static/25411174200951262930831/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值