ソードはオファーシリーズの「ポーカーストレート」を指します

LLは今日とても良い気分です。彼はトランプのデッキを購入し、実際には2人の王と2人の小さな王がいることを発見しました(カードのデッキは元々54でした)...彼はそこからランダムに5枚のカードを引きました幸運なことに、ストレートを描くことができるかどうかを確認し、描くことができる場合は、スポーツ宝くじを購入することにしました。「ハートエース、スペードの3つ、リトルキング、ビッグキング、スクエアピース5」、「オーマイゴッド!」ストレートではありません... LLは幸せではない、と彼は考え、Big \ LittleKingができると判断しました。は任意の数と見なされ、Aは1、Jは11、Qは12、Kは13と見なされます。上記の5枚のカードは「1、2、3、4、5」(大王と小王はそれぞれ2と4と見なされます)、「とてもラッキー!」に変えることができます。LLはスポーツ宝くじを購入することにしました。ここで、このカードを使用して上記のプロセスをシミュレートし、LLがどれほど幸運であるかを教えてください。カードがストレートを形成できる場合はtrueを出力し、そうでない場合はfalseを出力します。便宜上、サイズキングは0と見なすことができます。

2つの状況を考えてみましょう。

  1. numbers0を含まない場合:
    では、どのように判断するのですか?必要性はまっすぐなので、まず第一に不能有重复值、繰り返される値がない場合、形状はのよう[1 2 3 4 5]
    [5 6 7 8 9]になります最大值与最小值的差值应该小于5

  2. numbers0が含まれている場合:0
    以降の値を削除した場合の判定方法は1と同じです。

アイデア:最初に並べ替えてから、最後の0の位置を記録します。0は王のサイズを表すため、任意の数として機能し、0を除く最小の数からトラバースできます。同じ数がある場合は、その後、トラバースした場合、0以外に同じ数がないことがわかり、最終的に0以外の最大値と最小値の差が5未満かどうかを判断します。

import java.util.Arrays;

public class Solution {
    
    
    public boolean isContinuous(int[] numbers) {
    
    
        int len = numbers.length;
        if(len == 0 || numbers == null) return false;
        Arrays.sort(numbers);
        int i = 0; 
        for(int j = 0; j < len; j++){
    
    
            if(numbers[j] == 0) {
    
    
                i++; // i记录最小值的下标
                continue;
            }
            if(j+1 < len && numbers[j] == numbers[j+1]){
    
    
                return false;
            }
        }
        return numbers[len-1] - numbers[i] < 5;
    }
}

時間計算量:O(NlogN)
空間計算量:O(1)

おすすめ

転載: blog.csdn.net/weixin_44471490/article/details/108943705