java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大...

本文介绍了一个Java程序,用于判断从一副扑克牌中随机抽取的五张牌是否构成顺子。程序通过检查牌面数值的连续性和大小王(视为0)的灵活运用,实现了这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.ljn.base;

import java.util.Arrays;
import java.util.Random;

public class ContinuousPoker {

/**
* Q67 扑克牌的顺子 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
* 2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
*/
private static final int[] poker = {
0, 0,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
};

private static final int MAX = 5;
private static final int MAX_VAL = 13;

public static void main(String[] args) {
// test 1.Specific data for test.
int[][] testData = {
{ 7, 8, 0, 10, 11 },
{ 7, 8, 0, 0, 11 },
{ 8, 9, 9, 10, 11 },
{ 7, 8, 9, 10, 11 },
{ 0, 8, 0, 10, 11 },
};
for (int[] pokerSelected : testData) {
test(pokerSelected);
}
// test 2.Imitate the real situation:Select 5 poker randomly.
int[] pokerSelected = randomSelect(poker, MAX);
test(pokerSelected);

}

public static void test(int[] pokerSelected) {
System.out.println(Arrays.toString(pokerSelected));
boolean continuous = isContinuous(pokerSelected);
System.out.println("continuous is " + continuous);
}

/*
* 1)确认5张牌中除了0,其余数字没有重复的(可以用表统计的方法);
* 2)
* 满足这样的逻辑:(max,min分别代表5张牌中的除0以外的最大值最小值) 如果没有0,则max-min=4,则为顺子,否则不是
* 如果有一个0,则max-min=4或者3,则为顺子,否则不是 如果有两个0,则max-min=4或者3或者2,则为顺子,否则不是
*
* 最大值和最小值在第1步中就可以获得
*/
public static boolean isContinuous(int[] x) {
int[] existTimes = new int[MAX_VAL + 1];
boolean result = false;
int len = x.length;
int max = x[0], min = x[0];
int zeroCount = 0;
for (int i = 0; i < len; i++) {
existTimes[x[i]]++;// record the number of occurrences
if (x[i] == 0) {
zeroCount++;
} else {
if (x[i] > max || max == 0)
max = x[i];
if (x[i] < min || min == 0)
min = x[i];
}
}
for (int i = 1; i < MAX_VAL; i++) {// i starts from 1,exclude '0'
if (existTimes[i] > 1) {// duplicate non-zero element
return false;
}
}
if (zeroCount == 0) {
if (max - min == MAX - 1)
result = true;
} else if (zeroCount == 1) {
if (max - min == MAX - 1 || max - min == MAX - 2)
result = true;
} else if (zeroCount == 2) {
if (max - min == MAX - 1 || max - min == MAX - 2 || max - min == MAX - 3)
result = true;
}

return result;
}

/*
* @param count how many elements you want to pick
*
* @param data the data array
*/
public static int[] randomSelect(int[] data, int count) {
int[] result = new int[count];
int len = data.length;
for (int i = 0; i < count; i++) {
Random random = new Random();
int pos = random.nextInt(len);
result[i] = data[pos];// pick out the element
data[pos] = data[len - 1];// and replace it with the last element
len--;
}
return result;
}
}
### C语言实现判断是否为顺子 在C语言中,可以通过多种方法来判断给定的五扑克牌是否形成一个顺子。一种常见的做法是在不使用内置排序函数的情况下,通过分析面数值之间的关系来进行判定。 #### 方法一:基于等差数列特性 考虑到顺子本质上是一个公差为1的等差数列,因此可以直接计算这些数字的最值和最小值之差,并检查这个差距是否等于4(因为有5连续整数)。同时还需要处理大小作为万能的情况[^3]。 ```c #include <stdio.h> #define MAX_CARDS 5 int isStraight(int cards[], int wildCount) { int minValue = 14, maxValue = -1; for (int i = 0; i < MAX_CARDS; ++i){ if(cards[i] != 0){ // 跳过大小 if(cards[i] < minValue) minValue = cards[i]; if(cards[i] > maxValue) maxValue = cards[i]; } } // 如果最值减去最小值小于等于4,则可能是顺子 return ((maxValue - minValue) <= 4 && (wildCount >= (MAX_CARDS-(maxValue-minValue+1)))); } void checkIfStraight(){ int cards[MAX_CARDS], wildCount=0; printf("请输入五个整数表示手上的(0代表大小):\n"); for(int i=0;i<MAX_CARDS;++i){ scanf("%d", &cards[i]); if(cards[i]==0)// 统计大小数量 wildCount++; } if(isStraight(cards,wildCount)) puts("这是一个顺子!"); else puts("这不是一个顺子..."); } ``` 这段代码首先定义了一个辅助函数`isStraight()`用于检测数组内的元素能否组成顺子。这里假设所有的非零元素都是有效的号,并且允许存在最多两个‘0’用来替代任何其他。主函数`checkIfStraight()`负责接收用户输入并调用辅助函数完成最终的结果输出。 #### 方法二:考虑特殊字符转换 如果需要支持更复杂的输入形式比如字母'A', 'K'等以及大小写敏感的小/标记"w"/"W",则可以在预处理阶段将它们映射到对应的数值上再执行上述逻辑: ```c char cardChars[]="23456789TJQKA"; // ... 在适当位置加入此表查找功能 ... for(i=0;i<strlen(card);++i){ char c = tolower(card[i]); // 将所有字符转成小写字母方便匹配 if(c=='w') { /* 处理大小 */ continue;} // 查找对应索引 for(j=0;j<=sizeof(cardChars)-1&&cardChars[j]!=c;++j); if(j>=(signed)sizeof(cardChars)){ fprintf(stderr,"未知卡片%c\n",c); exit(EXIT_FAILURE); }else{ cards[count++]=j+2;// 数字卡从2开始编号 } } ``` 这种方法使得程序能够接受更加灵活多样的输入格式,同时也保持了核心算法不变[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值