【刷算法】扑克牌顺子

问题形貌

LL本日心境迥殊好,由于他去买了一副扑克牌,发明内里居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测本身的手气,看看能不能抽到顺子,假如抽到的话,他决议去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决议大小 王能够算作任何数字,而且A看作1,J为11,Q为12,K为13。上面的5张牌就能够变成“1,2,3,4,5”(大小王离别看作2和4),“So Lucky!”。LL决议去买体育彩票啦。 如今,请求你运用这幅牌模仿上面的历程,然后通知我们LL的命运运限怎样, 假如牌能组成顺子就输出true,不然就输出false。为了轻易起见,你能够以为大小王是0。

剖析

简朴地说,实在就是给一个数组,搜检数组是不是组成一个递次序列,且数组中的0能够被替换为恣意数字。

比方:

[0,0,1,2,3]能够看作[1,2,3,4,5]

[0,1,3,4,5]能够看作[1,2,3,4,5]

然则类似于[0,1,4,5,6]就不可,由于4和1之间须要两个数字来补,然则只要一个0,所以不能组成顺子。

所以总结一下:

  1. 序列中有雷同的数字,即对子的涌现,则返回false
  2. 假如涌现了n个0,申明能够由n个数字能够被补上,这个时刻须要搜检全部序列须要几个数字来补,记为m,假如m大于n,则返回false,不然返回true。比方:

    数组[0,0,2,4,7],遍历序列后须要(4-2-1)+(7-4-1)=3个数字来补,然则0的个数是2,所以补不够,返回false

代码完成

function IsContinuous(numbers)
{
    if(numbers === null || numbers.length !== 5)    
        return false;
    
    numbers.sort(function(a,b) {
        return a-b;
    })
    
    var count = 0;    // 有几个王
    var distance = 0;    // 差值
    if(numbers[3] === 0)
        return true;
    else if(numbers[2] === 0)
        count = 3;
    else if(numbers[1] === 0)
        count = 2;
    else if(numbers[0] === 0)
        count = 1;
    
    for(var i = count;i < numbers.length-1;i++) {
        if(numbers[i+1] - numbers[i] === 0)
            return false;
        else if(numbers[i+1] - numbers[i] === 1)
            continue;
        else 
            distance = distance + numbers[i+1] - numbers[i] - 1;
    }
    
    if(distance > count)
        return false;
    else 
        return true;
}
    原文作者:亚古
    原文地址: https://segmentfault.com/a/1190000015785771
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞