算法题7 判断扑克牌中的顺子

题目:

  来源 http://www.cnblogs.com/python27/archive/2011/11/27/2264405.html

  随机抽取扑克牌中的n张牌,判断是不是顺子,即这5张牌是不是连续的。其中A看成1,J看成11,Q看成12,K看成13,大小王可以看成任何需要的数字。

分析:

  对于扑克牌来说,数字范围是很明确的,1到K外加大小王(设定为M)。假如这副牌是个顺子,也就是每张牌都不相同,那么利用一个大小为14的辅助数组counts[]就可以快速的实现排序,记录每张牌出现的次数,然后遍历输出次数为1的值即可。

判断这副牌是不是一个连续数列,需要判断相邻两个数字的差是否为1,大于1的话由M来填充(可以填充两个缺位)。

因为这样一副牌最多不过54张,算法时间复杂度O(1),空间复杂度O(1)

bool IsContinuousPoker(char* pokers,unsigned int n)
{
	if (pokers==NULL||n==0)
		throw std::exception("Invalid input.");

	int *counts=new int[14]();

	char *p=pokers;
	unsigned int num=0;
	while (*p!=‘\0‘)
	{
		if (*p==‘J‘)
			num=11;
		else if (*p==‘Q‘)
			num=12;
		else if (*p==‘K‘)
			num=13;
		else if(*p==‘M‘)
			 num=0;
		else
			num=*p-‘0‘;

		counts[num]++;
		if(num!=0&&counts[num]>1)
			return false;

		p++;
	}

	int pre=0;
	for (int i=1;i<14;i++)
	{
		if (counts[i]==1)
		{
			int dif=i-pre-1;
			if (pre!=0&&dif>0)
			{
				counts[0]-=dif;
				if (counts[0]<0)
					return false;
			}
			pre=i;
		}
	}
	return true;
}

  

时间: 2024-08-05 19:05:44

算法题7 判断扑克牌中的顺子的相关文章

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码:

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

如何在JS中计算扑克牌中的顺子、对子、半顺、豹子、杂六

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>如何计算扑克牌中的顺子.对子.半顺.豹子.杂六</title> 5 <meta charset="utf-8"/> 6 </head> 7 <body> 8 号码1:<input type="number" value="5" id="num1&q

算法题之统计字符串中出现最多的字母

算法题之统计字符串中出现最多的字母 代码: <script> var arr = []; function txt(str) { var j = 0; for(var i = 0; i < str.length; i++) { if(arr.indexOf(str[i]) == -1) { arr.push(str[i]); } } for(var j = 0; j < arr.length; j++) { var s = arr[j]; var dd = str.split(s)

【剑指offer】61、扑克牌中的顺子

题目 从扑克牌中随机抽5张牌,判断是不是一个顺子.2~10为本身,A是1,J,Q,K分别是11,12,13.大小王百搭 思路 关键就是大小王百搭.把大小王都当作0. 我们先统计出数组中0的个数 然后将数组排序,统计不连续的空缺总数 最后判断0的个数是否比空缺总数大 class Solution { public: bool IsContinuous( vector<int> numbers ) { if (numbers.size() != 5 ) return false; int leng

面试题61:扑克牌中的顺子

1.题目描述: 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

常见算法题:判断表达式括号是否匹配

题目:设计一个算法,判断用户输入的表达式中括号是否匹配,表达式中可能含有圆括号.中括号和大括号. 思路:建立一个顺序栈,当表达式中有左括号时将其入栈,当出现右括号时,将栈顶元素出栈,检查与当前右括号是否匹配.最后如果栈为空则表示该表达式中的括号是匹配的. 代码: #include<iostream> #include<string> using namespace std; #define MaxSize 20 //字符串栈 class Stack { char *data; in

常见算法题:判断表达式是否是回文

题目:设计一个算法,判断用户输入的表达式中是否是回文(回文即左右对称的字符串). 思路:这道题与判断表达式括号是否匹配类似,可使用顺序栈来解决,区别是回文要求每个字符都要求匹配,因此将字符串全部入栈,再全部出栈,将最后一个字符与第一个字符比较是否相同,依次比较,若全部相同则为回文. 代码: #include<iostream> #include<string> using namespace std; #define MaxSize 20 //字符串栈 class Stack {

经典算法题-基础-替换字符串中的空格

目录 问题描述 解题思路 相关代码 问题描述 题目描述 请实现一个函数,把字符串中的每个空格替换成"%20" 要求 时间限制:1秒 空间限制:32768K 方法原型 public void replaceSpace(char[] str) 输入输出例子 输入:"Wa are happy" 输出:"We%20are%20happy" 解题思路 此题最自然的思路,就是从字符串的开始遍历,寻找空格,当遇到空格时,就将空格替换为"%20&quo