剑指Offer学习总结-扑克牌的顺子
2018-01-25 20:41
405 查看
剑指Offer学习总结-扑克牌的顺子
本系列为剑指Offer学习总结,主要是代码案例的分析和实现:书籍链接:http://product.dangdang.com/24242724.html
原作者博客:http://zhedahht.blog.163.com/blog/static/254111742011101624433132/
原作者博客链接有完整的项目代码下载。
扑克牌的顺子
题目
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。大小王可以看成任意数字。正确分析的解法
随机抽的5张牌可以看成5个数字组成的数组,大、小王是特殊的数字,不妨定义为0.接下来只要判断5个数字是不是连续的。最直观的方法是排序,然后用0去补满数组中的空缺。
如果排序后的数组不是连续的,即相邻的两个数字都相隔若干个数字,
但只要我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。
除此之外,还要注意非0数字重复出现,则该数组不是连续的
bool IsContinuous(int* numbers, int length) { if(numbers == NULL || length < 1) return false; //根据规则排序 qsort(numbers, length, sizeof(int), compare); int numberOfZero = 0; int numberOfGap = 0; // 统计数组中0的个数 for(int i = 0; i < length && numbers[i] == 0; ++i) ++ numberOfZero; // 统计数组中的间隔数目 int small = numberOfZero; int big = small + 1; while(big < length) { // 两个数相等,有对子,不可能是顺子 if(numbers[small] == numbers[big]) return false; //统计累计出最大的间隔是多少 差距为1 不算 numberOfGap += numbers[big] - numbers[small] - 1; small = big; ++big; } return (numberOfGap > numberOfZero) ? false : true; } int compare(const void *arg1, const void *arg2) { return *(int*)arg1 - *(int*)arg2; }
相关文章推荐
- 【剑指Offer学习】【面试题44:扑克牌的顺子】
- 剑指Offer面试题44:扑克牌的顺子 Java实现
- 剑指offer 面试题44 扑克牌顺子
- 剑指offer_递归与循环---扑克牌顺子
- 剑指Offer学习总结-数组中出现次数超过一半的数字
- 剑指Offer学习总结-从1到n整数中1出现的次数
- 剑指Offer学习总结-第一个只出现一次的字符
- 剑指Offer学习总结-不能被继承的类
- 剑指Offer学习总结-链表中倒数第 k 个结点
- 剑指offer-扑克牌顺子
- [剑指offer][面试题44]扑克牌的顺子(待完善)
- 剑指offer 把字符串转换成整数 扑克牌顺子
- 剑指Offer: 扑克牌顺子
- 【剑指offer】扑克牌的顺子
- 剑指Offer—45—扑克牌顺子
- 剑指Offer学习总结-替换空格
- 剑指Offer学习总结-不用加减乘除做加法
- 【剑指offer】之扑克牌的顺子
- 剑指offer 44. 扑克牌的顺子
- 剑指Offer学习总结-合并两个排序的链表