質問とテスト
package sword044;
/*扑克牌的顺子
从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。
2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。
*/
public class main {
public static void main(String[] args) {
int[][] testTable = {
{1,2,3,2,5},{1,2,3,4,5},{1,2,0,0,4},{1,6,2,7,1}};
for (int[] ito : testTable) {
test(ito);
}
}
private static void test(int[] ito) {
Solution solution = new Solution();
boolean rtn;
long begin = System.currentTimeMillis();
for (int i = 0; i < ito.length; i++) {
System.out.print(ito[i]+" ");
}
System.out.println();
//开始时打印数组
rtn = solution.IsContinuous(ito);//执行程序
long end = System.currentTimeMillis();
//System.out.println(ito + ": rtn=" + rtn);
System.out.println("rtn=" +rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
解決策1
トランプの背景をコンピューター言語に抽象化する必要があります。5枚のカードを5つの数字の配列と考えることができることを想像するのは難しいことではありません。大小の王は特別な番号です。他のカードと区別できるように、0と定義することもできます。
次に、5つの数値が連続しているかどうかを分析および判断します。最も直感的な方法は、配列を並べ替えることです。0は任意の数値として使用できるため、0を使用して配列のギャップを埋めることができることに注意してください。並べ替えられた配列が連続していない場合、つまり、隣接する2つの数値がいくつかの数値のようである場合、2つの空の数値を埋めるのに十分な0がある限り、配列は実際には連続です。たとえば、配列は{0、1、3、4、5}に並べ替えられ、1から3の間に空席があります。0があるだけです。つまり、空席を埋めるために2として使用できます。 。
したがって、3つのことを行う必要があります。最初に配列を並べ替え、次に配列内の0の数を数え、最後に並べ替え後に配列内の隣接する数の間の空席の総数を数えます。空室の数が0以下の場合、配列は連続的です。それ以外の場合、配列は連続的ではありません。
最後に、1つの点に注意する必要があります。配列内のゼロ以外の数値が繰り返し表示される場合、配列は連続していません。トランプへの変更の説明は、カードのペアにペアが含まれている場合、それはストレートにはなり得ないということです。
package sword044;
import java.util.Arrays;
public class Solution {
public boolean IsContinuous(int[] nums) {
int length = nums.length;
if(length != 5) {
return false;
}
Arrays.sort(nums);
int zeroNum = 0;
// 先计算0的数目
for(int i=0;i<5;i++) {
if(nums[i] == 0) {
zeroNum++;
}else {
break;
}
}
if(zeroNum == 5 || zeroNum == 4) {
return true;
}
int zeroNeed = 0;
int prev = nums[zeroNum];
for(int i= zeroNum+1;i<5;i++) {
int now = nums[i];
if(now == prev) {
return false;
}
zeroNeed +=now-prev-1;
prev = now;
}
if(zeroNeed<=zeroNum) {
return true;
}else {
return false;
}
}
}