[抽象建模问题]扑克牌的顺子判断

根据抽到的5张扑克牌,判断是不是顺子。注意:大小王可以随便的代替任何的牌。

bool IsContinuous( vector<int> numbers )
{
	int i = 0;
	int length = numbers.size();
	if(length <= 0)
	{
		return false;
	}
	int *arr = &numbers[0];
	qsort(arr, length, sizeof(int), compare);

	//统计0的个数
	int numberOfZero = 0;
	for(i = 0; i < length && numbers[i] == 0; ++i)
	{
		++numberOfZero;
	}
	//统计空缺的个数
	int numberOfGap = 0;
	int start = numberOfZero;
	int end = start + 1;
	while(end < length)
	{
		if(numbers[end] == numbers[start])
			return false;
		else
		{
			numberOfGap += numbers[end] - numbers[start] - 1;
			start++;
			end++;
		}
	}//while

	return numberOfGap > numberOfZero ? false : true;
}

static int compare(const void *arg1, const void *arg2)
{
	return *(int*)arg1 - *(int*)arg2;
}

注意一下注意点:

1. 大小王先用0表示,这样方便处理。

2. qsort的用法:

功 能: 使用快速排序例程进行排序
头文件:stdlib.h
用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
参数:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序

int compare(const void *elem1, const void *elem2 );

  

时间: 2024-10-18 03:34:20

[抽象建模问题]扑克牌的顺子判断的相关文章

剑指offer 45.抽象建模能力 扑克牌顺子

题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13.上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”.

40.扑克牌的顺子

http://zhedahht.blog.163.com/blog/static/25411174200951262930831/ http://blog.csdn.net/wuzhekai1985/article/details/6639919 题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字. 分析:这题目很有意思,是一个典型的寓教于乐的题目. 我们需要把扑克牌的背景抽象成计算机语言.

【编程题目】扑克牌的顺子

67.俩个闲玩娱乐(运算).1.扑克牌的顺子从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的.2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字. 思路: 用min.max记录输入的牌对应的数字大小,不考虑王,用wnum记录王的个数, record[13]记录每种牌是否出现过.设要判断n个牌是否连续 只要  出现不重复 且(max - min + 1) 在 [ n - wnum , n ]之间即可 /* 67.俩个闲玩娱

算法:扑克牌的顺子

扑克牌的顺子从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的. 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字. 没找到很好的解法,贴上我的解法,看有没有更好的解法. 我用一个数组存储输入的数字,用99代表大小王,然后对其排序,当期不为99时求出其前一个与后一个的差值-1之和,即中间差了多少张牌,与王的数量对比. #include <iostream>#include <stack>using name

剑指offer (44) 扑克牌的顺子

题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的 2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可以替换任意数字 题解分析: step1. 首先大小王看作0,与其他数字都区分开 step2. 对这5张牌排序 step3. 统计5张牌中0的个数和 相邻数字之间的空缺总数,因为 我们可以把0替换掉空缺所需的数 bool IsContinuous(std::vector<int>& num) { if (num.size() != 5) retur

剑指Offer对答如流系列 - 扑克牌的顺子

面试题61:扑克牌的顺子 题目描述 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的. 2-10为数字本身,A为1,J为11,Q为12,K为13,而大.小王可以看成任意数字. 问题分析 这道题算法思想还是比较简单的. 记大小王记为0,具体步骤如下: 进行对5张牌进行排序: 找出0的个数: 算出相邻数字的空缺总数: 如果0的个数大于等于空缺总数,说明连续,反之不连续: 记得判断相邻数字是否相等,如果有出现相等,说明不是顺子. 问题解答 public boolean isConti

【剑指offer】:Q44:扑克牌的顺子

def IsContinuous(seq, num = 5): zeros = 0; d = 0 seq = sorted(seq) for i in range(num - 1): if seq[i] == 0: zeros += 1 continue if seq[i] == seq[i + 1]: return False d += seq[i + 1] - seq[i] - 1 return zeros >= d [剑指offer]:Q44:扑克牌的顺子,布布扣,bubuko.com

编程算法 - 扑克牌的顺子 代码(C)

扑克牌的顺子 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 从扑克牌中随机抽取5张牌, 推断是不是一个顺子, 即这5张牌是不是连续的. 2~10为数字本身, A为1, J为11, Q为12, K为13, 而大小王能够看成随意数字. 排序, 推断字符串之间的间隔数, 假设小于等于大小王的数量, 则是连续, 否则不是. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */

扑克牌的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的.2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以为任意数字. 我们需要把扑克牌的背景抽象成计算机语言.不难想象,我们可以把5张牌看成由5个数字组成的数组.大小王是特殊的数字,我们不妨把他们都定义为0,这样就能和其他牌区分开来了. 接下来我们分析怎样判断5个数字是不是连续的,最直观的方法是把数组排序.值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺.如果排序之后的数组是不连续的,即相