学校に戻る:3番目の質問-剣はオファー61を指します。ポーカーでまっすぐ

剣はオファー61を指します。ポーカーでストレート

トランプからランダムに5枚のカードを引いて、それがストレートかどうか、つまり5枚のカードが連続しているかどうかを判断します。2から10は数字そのもの、Aは1、Jは11、Qは12、Kは13、大小の王は0であり、任意の数字と見なすことができます。Aは14と見なすことはできません。

示例 1:

输入: [1,2,3,4,5]
输出: True
 

示例 2:

输入: [0,0,1,2,5]
输出: True
 

限制:

数组长度为 5 

数组的数取值为 [0, 13] .

回答:

この質問の要点は、主に数学的アイデアの適用ある全能の「0」の存在にありますまず、ハッシュテーブルのアイデアを使用して重複する番号を削除し 5枚のカードを並べ替えた、次のことを分析します。

描かれた5枚のカードにゼロがない場合、これは最も単純なケースです。5つの数字が連続しているかどうかを確認するだけで済みます。現時点では繰り返し番号がないため、最後の番号から最初の番号を引いたものが4の場合、真ん中の3つのピット、3つの異なる番号があるため、この時点ではストレートである必要があります。

次はケース2です。つまり、0のケースがあります。このとき、残りの4つの数字の最大から最小を引いたものが4の場合は状況と同じです。このとき距離が足りないため、0が使用する数が最大または最小の数であってはなりません。このようである、ピット3、2〜0,0はまた、ピット対応する数として作用することができるであろうように、任意の数として働くデジタル知ら知ら充填後の2桁の数字を残りの3つのピットである場合、
もし残りの4つの数字の最大値から最小値を引いたものが3である場合、状況は「2、3、4、5」と同様です。つまり、0が最小値または最大値として機能するため、ピットが決定され、数値は次のようになります。また、そうです。距離が大きすぎるため、残りの4つの数値の最大値から最小値を引いたものがもう一方であり、直線を形成することは不可能であるに違いありません。

次はケース3、つまり2つの0です。このとき、分析プロセスはケース2と同様です。0以外の3つの数値の最大削減が4の場合、ピットの数は固定されており、十分です。残りの数については
、結果が3時間と2時間で同じである場合、常にピットを継続して十分に保つことができます。他の場合は、ピットが多すぎることがわかり、その数は十分に満たされていないので、保持されません。
したがって、0が4、5、6 ...などの場合、同じことが当てはまります。

コード:

int cmp(int*x,int*y)
{
    
    
    return *x>*y;
}
bool isStraight(int* nums, int numsSize){
    
    
    qsort(nums,numsSize,sizeof(int),cmp);
    int zero = 0;
    int hash[14]={
    
    0};
    for(int i=0;i<numsSize;i++)
    {
    
    
        hash[nums[i]]++;
    }
    for(int i=1;i<14;i++)
    {
    
    
        if(hash[i]>=2)//如果有重复元素
        {
    
    
            return 0;
        }
    }
    for(int i=0;i<numsSize;i++)
    {
    
    
        if(nums[i]==0)
        {
    
    
            zero++;
        }
    }
    if(nums[4]-nums[0]==4)
    {
    
    
        return 1;
    }
    else
    {
    
    
        if(zero==0)
        {
    
    
            return 0;
        }
        else if(zero==1)
        {
    
    
            if(nums[4]-nums[1]==3||nums[4]-nums[1]==4)
            {
    
    
                return 1;
            }
            else
            {
    
    
                return 0;
            }
        }
        else if(zero==2)
        {
    
    
            if(nums[4]-nums[2]==2||nums[4]-nums[2]==2+1||nums[4]-nums[2]==4)
            {
    
    
                return 1;
            }
            else
            {
    
    
                return 0;
            }
        }
        else
        {
    
    
            if(nums[4]-nums[3]==1||nums[4]-nums[3]==2||nums[4]-nums[3]==3||nums[4]-nums[3]==4)
            {
    
    
                return 1;
            }
            else
            {
    
    
                return 0;
            }
        }
    }
    return 1;
}

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/xiangguang_fight/article/details/114379835