c语言如何判断是顺子

c语言如何判断是顺子

要判断一组数字是否是顺子,可以通过检查数字的连续性、处理重复数字、以及考虑大小王(如果有)来实现。

C语言是一种高效的编程语言,适合处理底层操作和算法实现。判断是否为顺子的主要方法有:排序检查、哈希映射、数学方法。下面我们将详细展开其中的排序检查方法。

一、排序检查方法

1. 理解顺子的定义

在扑克牌中,顺子是指五张连续的牌(不考虑花色)。例如,3、4、5、6、7就是一个顺子,而2、3、4、5、6也是一个顺子。如果大小王被用作万能牌,它们可以替代任何牌来形成顺子。

2. 实现思路

  • 排序数组:先将数组排序,这样可以方便的检查是否连续。
  • 检查连续性:遍历排序后的数组,检查相邻元素是否连续。
  • 处理大小王:如果有大小王,可以用它们来填补缺失的牌。

3. 示例代码

#include <stdio.h>

#include <stdlib.h>

int compare(const void *a, const void *b) {

return (*(int *)a - *(int *)b);

}

int isStraight(int *nums, int numsSize) {

// 先排序

qsort(nums, numsSize, sizeof(int), compare);

int joker = 0;

// 计算大小王的数量(假设大小王用0表示)

for (int i = 0; i < numsSize && nums[i] == 0; i++) {

joker++;

}

for (int i = joker; i < numsSize - 1; i++) {

// 两张牌相同,则不是顺子

if (nums[i] == nums[i + 1]) {

return 0;

}

// 计算间隔,大小王可以填补间隔

joker -= nums[i + 1] - nums[i] - 1;

if (joker < 0) {

return 0;

}

}

return 1;

}

int main() {

int nums[] = {0, 0, 1, 2, 5};

int size = sizeof(nums) / sizeof(nums[0]);

if (isStraight(nums, size)) {

printf("This is a straight.n");

} else {

printf("This is not a straight.n");

}

return 0;

}

二、哈希映射方法

1. 理解哈希映射

通过哈希映射,我们可以快速检查数组中的重复元素,并计算最大和最小值之间的差值来判断是否是顺子。

2. 实现思路

  • 哈希表存储元素:使用哈希表来存储已经出现的元素,避免重复。
  • 计算最大最小值:遍历数组找出最大值和最小值(忽略大小王)。
  • 判断条件:如果最大值和最小值的差值小于5,则是顺子。

3. 示例代码

#include <stdio.h>

#include <stdlib.h>

int isStraight(int *nums, int numsSize) {

int hash[14] = {0}; // 扑克牌数字范围是1-13,0代表大小王

int max = 0, min = 14;

for (int i = 0; i < numsSize; i++) {

if (nums[i] == 0) continue; // 跳过大小王

if (hash[nums[i]]++) return 0; // 出现重复数字则不是顺子

if (nums[i] > max) max = nums[i];

if (nums[i] < min) min = nums[i];

}

return max - min < 5;

}

int main() {

int nums[] = {0, 0, 1, 2, 5};

int size = sizeof(nums) / sizeof(nums[0]);

if (isStraight(nums, size)) {

printf("This is a straight.n");

} else {

printf("This is not a straight.n");

}

return 0;

}

三、数学方法

1. 利用数学原理

通过计算数组元素的最大值和最小值的差值,并考虑大小王的数量,可以判断是否为顺子。

2. 实现思路

  • 找出最大最小值:遍历数组找出最大值和最小值。
  • 计算差值:计算最大值和最小值的差值。
  • 判断条件:如果差值小于5,则是顺子。

3. 示例代码

#include <stdio.h>

int isStraight(int *nums, int numsSize) {

int max = 0, min = 14;

int joker = 0;

for (int i = 0; i < numsSize; i++) {

if (nums[i] == 0) {

joker++;

continue;

}

if (nums[i] > max) max = nums[i];

if (nums[i] < min) min = nums[i];

}

return (max - min < 5) || (max - min - joker < 5);

}

int main() {

int nums[] = {0, 0, 1, 2, 5};

int size = sizeof(nums) / sizeof(nums[0]);

if (isStraight(nums, size)) {

printf("This is a straight.n");

} else {

printf("This is not a straight.n");

}

return 0;

}

四、综合比较

1. 性能比较

  • 排序检查方法:需要排序,时间复杂度为O(nlogn)。
  • 哈希映射方法:利用哈希表检查,时间复杂度为O(n)。
  • 数学方法:计算最大最小值和差值,时间复杂度为O(n)。

2. 简单性

  • 排序检查方法:相对简单,适合初学者。
  • 哈希映射方法:需要理解哈希表的使用。
  • 数学方法:逻辑简单,但需考虑边界情况。

五、结论

选择适合的方法:根据实际需求和数据规模,选择最适合的方法。排序检查方法适合初学者,哈希映射方法和数学方法适合追求性能优化的场景。

在实际项目管理中,如果涉及到复杂的算法和数据处理,可以借助一些项目管理系统来提高效率。推荐使用研发项目管理系统PingCode通用项目管理软件Worktile来帮助管理和跟踪项目进度。

相关问答FAQs:

1. 顺子怎么定义?
顺子是指一组连续的数字,其中没有重复的数字,并且最大值与最小值之差为4。例如,1、2、3、4、5就是一个顺子。

2. 在C语言中如何判断一个数组是否是顺子?
要判断一个数组是否是顺子,可以先对数组进行排序,然后遍历数组,判断相邻两个数字之间的差值是否为1。如果所有相邻数字的差值都为1,并且没有重复数字,则可以确定该数组是一个顺子。

3. C语言中如何判断一个字符串是否是顺子?
如果要判断一个字符串是否是顺子,首先需要将字符串转换为数字数组,然后对数字数组进行排序。接下来,遍历数字数组,判断相邻两个数字之间的差值是否为1。如果所有相邻数字的差值都为1,并且没有重复数字,则可以确定该字符串是一个顺子。

文章包含AI辅助创作,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/985375

(0)
Edit1Edit1
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部