从扑克牌中随机抽取5张牌,判断是不是一个顺子。
来源:互联网 发布:网络视频电话机 编辑:程序博客网 时间:2024/06/08 02:04
一、算法描述:
从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字
二、算法解决:
在这个算法里,由于大小王可以是任意数字,所以即使像下面的5张牌,仍然可以是连续的。
图1
图2
所以说1的个数和数据之间的间隔和的关系决定了是不是一个连续的5个数。
以图2为例进行推导。
首先,先计算数组中含有0的个数。
IsZero = 2;
然后,将数组进行排序
图3
从数组numbers的4开始看数据间的间隔(numbers[i+1]-numbers[i]-1)
即从numbers[IsZero]开始进行统计
LenGap = 2
如果LenGap大于IsZero,则不能形成连续数组,否则可以形成连续数组。
三、算法实现:
算法通过Linux下运行的,主要包括continusCards.c,continusCards.h,main.c,Makefile四个文件
make即可得到结果
/*************************************************************************> File Name: continusCards.c> Author: cyf> Mail: XXX@qq.com > Created Time: 2016年04月06日 星期三 14时56分30秒 ************************************************************************/#include "continusCards.h"/* * 从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的 * 2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字 * */int InsertSort(int *numbers, int length){int ret = 0;if (numbers == NULL || length < 1){ret = -1;printf("func InsertSort() err:param\n");}int i = 0, j = 0;int temp = 0;for (i = 0; i < length; i++){for (j = i + 1; j < length; j++){if (numbers[i] > numbers[j]){temp = numbers[i];numbers[i] = numbers[j];numbers[j] = temp;}}}return ret;}int IsContinous(int *numbers, int length){/* * 先将数组进行排序,然后记录数组中0的个数 * 记录数组中的差距和,比较0的个数和数组差距 * */int ret = 0;if (numbers == NULL || length <1){ret = -1;return -1;}int IsZero = 0;int GapLen = 0;int i = 0;for (i = 0; i < length; i ++){if (numbers[i] == 0){IsZero ++;}}InsertSort(numbers, length);int pBegin = IsZero;int pEnd = IsZero + 1;while (pEnd < length){if (numbers[pBegin] == numbers[pEnd])ret = 1;GapLen = numbers[pEnd] - numbers[pBegin] - 1;pBegin = pEnd;pEnd ++;}if (GapLen > IsZero)ret = 1;return ret;}
/*************************************************************************> File Name: continusCards.h> Author: cyf> Mail: XXX@qq.com > Created Time: 2016年04月06日 星期三 14时48分52秒 ************************************************************************/#ifndef CONTINUSCARDS_H#define CONTINUSCARDS_H#include <stdio.h>#include <stdlib.h>#include <string.h>int IsContinous(int *numbers, int length);#endif
/*************************************************************************> File Name: main.c> Author: cyf> Mail: XXX@qq.com > Created Time: 2016年04月06日 星期三 15时19分36秒 ************************************************************************/#include "continusCards.h"int Test(char *testName, int *numbers, int length, int expected){int ret = 0;if (testName == NULL || numbers == NULL ||length <1){ret = -1;printf("func Test() err:param\n");}int result = 0;result = IsContinous(numbers, length);if (result == expected)printf("Test:%s is success!\n", testName);elseprintf("Test:%s is success!\n", testName);return ret;}int main(){int rv = 0;int testNumbers[5] = {9, 0, 5, 8, 7};int testNumbers1[5] = {0, 1, 5, 1, 3};int testNumbers2[5] = {0, 0, 5, 1, 3};rv = Test("test1", testNumbers, 5, 0);if (rv == -1){printf("func Test() err\n");}rv = Test("test2", testNumbers1, 5, 1);if (rv == -1){printf("func Test() err\n");}rv = Test("test3", testNumbers2, 5, 0);if (rv == -1){printf("func Test() err\n");}return 0;}
CC = gccCFLAGS = -g%.o:%.c$(CC) -o $@ -c $(CFLAGS) $<main:main.o continusCards.o$(CC) main.o continusCards.o -o main $(CFLAGS)clean:rm -rf *.o main
0 0
- 从扑克牌中随机抽取5张牌,判断是不是一个顺子。
- 从扑克牌中随机抽5张牌,判断是不是一个顺子
- 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
- 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
- 题目:扑克牌的顺子 从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。
- 剑指Offer题目:从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意的 数字。
- 在n张扑克牌中找出顺子
- 随机取扑克牌中10张牌
- 判断随机的五位数是不是顺子
- 从一个未知容量的投票木箱中,随机抽取m张投票
- 判断扑克牌中的顺子
- 判断扑克牌的顺子
- 剑指off-判断5张牌是否是顺子
- 如何判断五张扑克牌是不是连续的
- 求抽取扑克牌顺子的概率
- 23 判断扑克牌的顺子
- 剑指offer44-扑克牌顺子判断
- 从一个文件中随机抽取N行方法
- c++简单的ATL COM开发和调用实例
- 单词表制作小工具
- Java中的集合之List、ArrayList介绍
- Python通用序列操作
- 设置QLineEdit无边框且透明
- 从扑克牌中随机抽取5张牌,判断是不是一个顺子。
- 5.6.6 初始化命令解析次数计数
- RadioGroup+Fragment
- C++ 快速排序实现
- try catch 捕获异常
- CTS Verifier test
- Android动画--Interpolator(插值器)
- 5.6.7 执行指令状态机
- TextView 使用Selector设置颜色