首页 > 试题广场 >

从一副扑克牌中随机抽出5张牌

[问答题]
【编程题】
从一副扑克牌中随机抽出5张牌,判断是否可以组成顺子(即这3张牌是连续的),其中2-10为数字本身,A,J,Q,K在数组中分包由1、11、12、13表示,而大小王在数组中由0表示,并可以当成任意一张牌使用。

bool  IsContinue(int *number,int length){

}

如果按先排序,再判断相邻元素差值为1、2、3的做法,就算不考虑排序的时间复杂度,程序写起来也会很麻烦,需要判断多种情况。 如果换个思路,如果抽到的五张牌除了面值为0的牌可以重复,其余都不重复的话,有三种情况,第一种无0,最大值减去最小值等于4;第二种情况,有一个0,由于王牌可以替成两边和中间,替成两边的话,最大值减去最小值是3,替成中间为4,第三种情况同理,最大值减去最小值可以为4、3、2。 综上,要判断顺子,只需数字除0外不重复且最大值减去最小值的值小于等于4。
发表于 2017-07-30 08:26:01 回复(6)
#include<stdio.h>
#include<stdlib.h> 
#include<time.h> 

void bubblesort(int *a,int n)
{
int i,j,flag=1;
int temp;
for(i=1;i<n&&flag==1;i++) { flag=0; for(j=0;j<n-i;j++) { if(a[j]>a[j+1])
{
flag=1;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}

int main()
{
int a[5],j;
int c=0,c1=0,c2=0;
srand((int)time(NULL));
for(int i=0;i<5;i++)
{
a[i]=(rand() % (14));
printf("%d\n",a[i]);
}
bubblesort(a,5);//给5个数排序

if(a[0]==0)//因为给定数组长度,然后排序过,所以直接判断a[0],有一个0
{
for(int i=1;i<5;i++)
{
j=a[i+1]-a[i];
if(j==1)
c++;//记录两个相邻数组元素出现1的次数
if(j==2)
c1++;
}
if(c==4&&c1==0)
printf("这是一个顺子\n");
else if(c==3&&c1==1)
printf("这是一个顺子\n");
else
printf("这不是一个顺子\n");

}

else if(a[0]==0&&a[1]==0)//有两个0
{
for(int i=2;i<5;i++)
{
j=a[i+1]-a[i];
if(j==1)
c++;
if(j==2)
c1++;
if(j==3)
c2++;
}
if(c==2)
printf("这是一个顺子\n");
else if(c==1&&c1==1)
printf("这是一个顺子\n");
else if(c==1&&c2==1)
printf("这是一个顺子\n");
else
printf("这不是一个顺子\n");
}

else{//没有0

for(int i=0;i<5;i++)
{
j=a[i+1]-a[i];
if(j==1)
c++;
}
if(c==5)
{
printf("这是一个顺子\n");
}
else
printf("这不是一个顺子\n");

}
return 0;
}
我的思路是,在0-13中随机生成5个数,然后排序,因为排序过后,数组有0的话,肯定是最小的,而且一副牌只有两个王,所以判断a[0]和a[1],当只有一个0的时候,记录相邻元素之差1和2出现的次数,其他情况不可能是顺子,然后判断,当只有两个0的时候,记录相邻元素之差1,2,3出现的次数,其他情况不可能,然后判断,都不满足条件,就说明数组中没有0,然后就记录1出现的次数,判断是否等于5,如果不满足,就说明不是顺子,但我写的代码有一个缺点,就是可能生出3个0或者5个1,随机生成的,但是生出相同5个数的概率是1/13^5;觉得有点低,小概率事件,新手写的代码,欢迎大家指出问题

编辑于 2017-07-28 19:19:55 回复(2)
先排序,然后看有没有零,如果没有零,就得严格按照顺子的排序从左到右查看是否逐一增一;如果有零,大于等于两个零就可以确定了;有一个零就需要看从非零的那一张开始,是否相邻两张之间的间隔是一或者二。 这样就可以了吧?
发表于 2017-07-27 07:54:55 回复(1)
public static void main(String[] args) {
        isShunzi();
    }
    private static void isShunzi(){
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 1; i < 14; i++) {
            for (int j = 0; j < 4; j++) {
                list.add(i);
            }
        }
        list.add(0);
        list.add(0);
        Collections.shuffle(list);
        ArrayList<Integer> arrayList = new ArrayList<>();
        boolean flag=false;
        for (int i = 0; i < 3; i++) {
            arrayList.add(list.get(i));
        }
        Collections.sort(arrayList);
        int l0=arrayList.get(0);
        int l1=arrayList.get(1);
        int l2=arrayList.get(2);
        if (l0==0&&l1==0){
            flag=true;
        }else if (l0==0&&(l2==(l1+1))){
            flag=true;
        }else if (l2==(l1+1)&&l1==(l0+1)){
            flag=true;
        }else if (l0==1&&l1==12&&l2==13){
            flag=true;
        }else {
            flag=false;
        }
        if (flag){
            System.out.println("随机抽取的三张牌"+l0+","+l1+","+l2+"是顺子");
        }else {
            System.out.println("随机抽取的三张牌"+l0+","+l1+","+l2+"不是顺子");
        }
    }
结果:随机抽取的三张牌3,11,12不是顺子
发表于 2019-09-10 00:16:32 回复(0)
1.先对这5个数字进行排序 2.如果没有0,比较第1-3,2-4,3-5个元素之间的两两是差值是否为1。 3.如果有一个0,比较2-3,3-4,4-5个元素的差为1或者2,如果有,则连续。 4.如果两个0,随便怎样都连续。
发表于 2017-09-12 08:13:00 回复(0)

发表于 2017-07-31 19:54:18 回复(0)
给定若干张扑克牌,在大小王可当做任意扑克牌时是否能全连续(顺子)。。。
思路很大众
1. 首先排序整个数组,那么如果有大小王必定为前一两个,并且其他扑克牌按大小排列好
2. 遍历整个数组,统计两种数据:
    a. 大小王的个数(看看有多少张万能扑克牌)
    b. 不是大小王的情况下,任意相邻两张扑克牌的差距(d)之和(差距为0直接毙掉,差距              为1表示扑克牌相邻记为d-1=0,差距大于1表示中间跳了d-1扑克牌)
3. 最后看看所有万能扑克牌能否填充所有缺少的扑克牌

static boolean isContinue(int[] nums) {
    Arrays.sort(nums);
    int zero = 0, sum = 0, temp = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] == 0) {
            zero++;
            continue;
        }
        if (i != nums.length - 1) {
            temp = nums[i + 1] - nums[i];
            if (temp == 0) {
                return false;
            }
            sum += temp - 1;
        }
    }
    return zero == sum;
} 

编辑于 2018-10-10 23:02:38 回复(0)
剑指offer--第61题
发表于 2018-03-31 23:56:43 回复(0)
import java.util.Arrays; public class IsContinuousCard { public boolean isContinuous(int [] numbers) { if(numbers == null || numbers.length == 0) return false; //对数组进行排序 Arrays.sort(numbers); //统计大小王的张数 int numberOfZero = 0; int numberOfGap = 0; for(int i = 0; i < numbers.length && numbers[i] == 0; i++) 
         numberOfZero++; int low = numberOfZero; int high = low + 1; while(high < numbers.length){ //如果出现了对子则不可能是顺子 if(numbers[low] == numbers[high]) return false; //计算空缺数 numberOfGap += numbers[high] - numbers[low] - 1;
          low = high;
          high++;
        } return numberOfGap <= numberOfZero ? true : false;
    } public static void main(String[] args) { int[] numbers = {1,3,2,4,5};
        IsContinuousCard c = new IsContinuousCard(); boolean f = c.isContinuous(numbers);
        System.out.println(f);
    }
} 

发表于 2018-01-24 09:09:31 回复(0)
//先排序,然后再根据零的个数条件进一步判断要几个相邻数连续

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    
    public static boolean isContinue(int[] arr)
    {
        Arrays.sort(arr);
        int length = arr.length;
        int flag=0;
        for(int i=length-1;i>=1;i--)
        {
            if((arr[i]-arr[i-1])==1)
            {
                flag++;
                continue;
            }else
            {
                flag=0;
            }
        }
        if(arr[0]==0&&arr[1]==0) return true;
        else
            if((arr[0]==0 && flag>=1)||flag>=2)
            {
                return true;
            }else {
                return false;
            }
        
        
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int [] arr = new int[5];
        for(int i=0;i<5;i++)
        {
            arr[i]=in.nextInt();
        }
        
        System.out.println(isContinue(arr));
        

    }

}
 
发表于 2017-08-21 17:56:35 回复(0)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Scanner sc = new Scanner(System.in);
  int number[] = new int[5];
  for(int i = 0; i < 5; i++)
  {
   number[i] = sc.nextInt();
  }
  Arrays.sort(number);
  int countOfZero = 0;
  for(int j = 0; j < 5; j++)
  {
   if(number[j] == 0)
   {
    countOfZero++;
   }
   else
   {
    break;
   }
  }
  int countOfGap = 0;
  for(int j = countOfZero+1; j < 5; j++)
  {
   if(number[j-1]==number[j])
   {
    System.out.println("不是顺子");
    return;
   }
   else
    countOfGap += (number[j] - number[j-1] -1);
  }
  if(countOfZero != countOfGap)
  {
   System.out.println("不是顺子");
   
  }
  else
   System.out.println("是顺子");
  
 }
}
发表于 2017-08-21 16:48:19 回复(0)
#include<iostream>
usingnamespacestd;
boolIsContinue(int*number,intlength)
{
    booltype;
    inti,j,tmp,sum=0;
    for(i=0;i<length-1;i++)   //将抽到的数组进行从小到大排序
        for(j=i+1;j<length;j++)
        {
            if(number[i]>number[j])
            {
                tmp=number[i];
                number[i]=number[j];
                number[j]=tmp;
            }
 
        }
    if(number[0]!=0)   //没有王存在的情况
    {
        if(number[length-1]-number[0]==length-1)
            type=true;
        else
            type=false;
    }
    elseif(number[1]==0)   //两个王存在的情况
    {
        if(number[length-1]-number[2]==length-1)
            type=true;
        else
            type=false;
    }
    else   //一个王存在的情况
    {
        if(number[length-1]-number[1]==length-1)
            type=true;
        else
            type=false;
    }
    returntype;
}
intmain()
{
    inta[5]={6,3,0,7,5};
    cout<<IsContinue(a,5)<<endl;
    return0;
}
发表于 2017-08-21 12:28:36 回复(0)
import java.util.ArrayList;
import java.util.List;

public class Test2 {

static boolean  IsContinue(int a[],int length){
for(int i=0;i<length-1;i++){
for(int j=0;j<length-1-i;j++){
if(a[j]>a[j+1]){
a[j]^=a[j+1];
a[j+1]^=a[j];
a[j]^=a[j+1];
}
}
}
for(int i=0;i<length-1;i++){
if(a[i]+1!=a[i+1]){
System.out.println("no shun");
return false;
}
}
return true;
}
public static void main(String[] args) {
List list=new ArrayList<>();
int a[]=new int[5];
for(int i=0;i<=13;i++){
list.add(i);
}
System.out.println(list);
for(int i=0;i<5;i++){
int random=(int)Math.round(Math.random()*(list.size()-1));
a[i]=(int)list.get(random);
System.out.print(a[i]+",");
list.remove(random);
}
boolean result=IsContinue(a,a.length);
if(result==true){
System.out.println("是顺子");
}else{
System.out.println("不是顺子");
}
}
}

发表于 2017-08-19 12:40:02 回复(0)
将五张牌从小到大排序,判断每张牌是否都比前一张大1!是则0,否则1!
发表于 2017-07-26 02:51:50 回复(0)
对数组排序,再判断是否有0
发表于 2017-07-26 00:26:07 回复(0)
定义一个数组,存这5个数,定义a b 取a为a0判断有没有0, 0个0 如果有数和a相差1 设为b 再判断 其余3个数和这2个数是否差1 然后输出结果 1个0 如果有数和a相差1 设为b 输出结果 2个0 输出结果
发表于 2017-07-25 21:19:22 回复(0)
aaaaa
发表于 2017-07-25 16:52:24 回复(0)
是三张牌连续还是五张牌连续
发表于 2017-07-23 13:01:09 回复(0)