华为面试题:扑克牌大小 C语言源码

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):

3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER。

请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR。

基本规则:

(1)输入每手牌可能是个子、对子、顺子(连续5张)、三个、炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;

(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子);

(3)大小规则跟大家平时了解的常见规则相同,个子、对子、三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;

(4)输入的两手牌不会出现相等的情况。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX_PATH 256

int getValue(char *buffer)
{
 if (strcmp(buffer,"3")==0)
 {
  return 3;
 }
 else if (strcmp(buffer,"4")==0)
 {
  return 4;
 }
 else if (strcmp(buffer,"5")==0)
 {
  return 5;
 }
 else if (strcmp(buffer,"6")==0)
 {
  return 6;
 }
 else if (strcmp(buffer,"7")==0)
 {
  return 7;
 }
 else if (strcmp(buffer,"8")==0)
 {
  return 8;
 }
 else if (strcmp(buffer,"9")==0)
 {
  return 9;
 }
 else if (strcmp(buffer,"10")==0)
 {
  return 10;
 }
 else if (strcmp(buffer,"10")==0)
 {
  return 10;
 }
 else if (strcmp(buffer,"J")==0)
 {
  return 11;
 }
 else if (strcmp(buffer,"Q")==0)
 {
  return 12;
 }
 else if (strcmp(buffer,"K")==0)
 {
  return 13;
 }
 else if (strcmp(buffer,"A")==0)
 {
  return 14;
 }
 else if (strcmp(buffer,"2")==0)
 {
  return 15;
 }
 else if (strcmp(buffer,"joker")==0)
 {
  return 16;
 }
 else if (strcmp(buffer,"JOKER")==0)
 {
  return 17;
 }
}
int impl(char *buffer)
{
 char *atmp = strtok(buffer,"-");
 char *btmp = strtok(NULL,"-");
 char a[MAX_PATH] = {0};
 char b[MAX_PATH] = {0};
 memcpy(a,atmp,strlen(atmp));
 memcpy(b,btmp,strlen(btmp));
 if(strstr(a,"joker"))
 {
  printf(atmp);
  return 0;
 }
 else if(strstr(b,"joker"))
 {
  printf(btmp);
  return 0;
 }
 int numa = 1;
 for (int i=0;i<strlen(a);i++)
 {
  if (a[i]==' ')
  {
   numa++;
  }
 }
 int numb = 1;
 for (int i=0;i<strlen(b);i++)
 {
  if (a[i]==' ')
  {
   numb++;
  }
 }
 if (numa==4 && numb!=4)
 {
  printf(atmp);
  return 0;
 }
 if (numa!=4 && numb==4)
 {
  printf(btmp);
  return 0;
 }
 if (numa==4 && numb==4)
 {
  int at = getValue(strtok(a," "));
  int bt = getValue(strtok(b," "));
  if (at>bt)
  {
   printf(atmp);
   return 0;
  }
  else
  {
   printf(btmp);
   return 0;
  }
 }
 if (numa!=4 && numb!=4)
 {
  if (numa==1)
  {
   int at = getValue(a);
   int bt = getValue(b);
   if (at>bt)
   {
    printf(atmp);
    return 0;
   }
   else
   {
    printf(btmp);
    return 0;
   }
  }
  else
  {
   int at = getValue(strtok(a," "));
   int bt = getValue(strtok(b," "));
   if (at>bt)
   {
    printf(atmp);
    return 0;
   }
   else
   {
    printf(btmp);
    return 0;
   }
  }
 }
}
int main()
{
 char buffer[MAX_PATH] = {0};
 gets(buffer);
 impl(buffer);
//  char test[20][20] = {"6-A","6-joker","3 3-10 10","3 3 3-2 2 2","J J J J-Q Q Q Q","J J J J-2 2 2","J J J J-joker JOKER"};
//  for (int i=0;i<7;i++)
//  {
//   impl(test[i]);
//  }
 return 0;
}
时间: 2024-10-15 18:12:04

华为面试题:扑克牌大小 C语言源码的相关文章

华为面试题:四则运算 C语言源码

四则运算 描述: 请实现如下接口 /* 功能:四则运算 * 输入:strExpression:字符串格式的算术表达式,如: "3+2*{1+2*[-4/(8-6)+7]}" * 返回:算术表达式的计算结果 */ public static int calculate(String strExpression) { /* 请实现*/ return 0; } 约束: pucExpression字符串中的有效字符包括['0'-'9'],'+','-', '*','/' ,'(', ')','

比特币挂机网赚易语言源码日赚200已上+网站+视频全套

是于易语言开发而成 在线挂机获取收益 软件内设VIP系统 提款系统 推广系统 等多功能化 如而要易语言程序源码的可以联系我QQ 382913699 注册的话需要下载软件,软件大小不到2M,下载下来后注册下,一般一天可以挖200块钱左右!提现的不是VIP一天只能提现1次,一次0.3元! VIP没有这个限制!首先我不是VIP所以不敢断言一定 所以请大家帮个忙,复制下网址访问下就可以了! 等访问量达到500一定给大家反馈下!就算是假的 一天领0.3元也好啊

Go语言源码中的Rabin-Karp算法

strings.go包实现了一个Rabin-Karp算法.有点意思. 关于这个算法: 图灵社区的有一篇: 图说Rabin-Karp字符串查找算法 关于Go源码实现: 网友GoLove已写一个篇非常详细的说明了. http://www.cnblogs.com/golove/p/3234673.html GoLove那个已经分析的非常清楚了,只是前面那一串说明太长了.我把他的说明替换成代码形式. 直接跑起来,这样更能看得清楚些. package main import ( "fmt" &q

Go语言源码中Replacer查找部份的笔记

用过strings.NewReplacer,replacer.Replace(),它按对传入参数后,能依优先级替换,并能处理中文字符串参数. 觉得功能强大,特别好用.对它的查找和优先级怎么处理有点兴趣,花时间研究了下源码,在这记录一下个人理解. package main //author:xcl //2014-1-20 记录 import ( "fmt" "strings" ) func main(){ patterns := []string{ "y&q

go语言源码赏析之strings

0.字符串为不可变类型,内部使用指针指向UTF-8字节数组 不过要修改字符串可以先将其转换成[]byte或者[]rune.如下 package main func main() { s := "abcd" bs := []byte(s) bs[1] = 'B' println(string(bs)) u := "电脑" us := []rune(u) us[1] = '话' println(string(us)) } 输出: aBcd 电话 for遍历字符串有byt

华为面试题:识别有效的ip地址和子网掩码并分类 C语言源码

识别有效的ip地址和子网掩码并分类: 按行输入多组数据 10.8.9.2~255.0.0.0 180.8.9.2~255.254.0.0 打印:A B C D E 错误的ip或掩码 私有ip 的个数 #include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX_PATH 256 int maze[10][10] = {0}; int route[100][2] = {

华为面试题:开放的书名检索库 c语言源码

开放的书名检索库 实现一个开放的书名检索库.库中存储了若干个书名.用户可以:指定搜索条件,搜索库中符合条件的书名 重要格式说明 单词 由小写英文字母组成,不含其它字符. 书名 由一个或多个单词组成. 当包含多个单词时,单词间用一个空格分隔:第一个单词前和最后一个单词后没有空格. 若只包含一个单词,则该单词前后均无空格. 搜索条件 1.由一个或多个不重复的关键字组成,每个关键字是一个单词. 2.当包含多个关键字时,关键字间用一个空格分隔:第一个关键字前和最后一个关键字后没有空格. 3.若只包含一个

华为面试题:迷宫问题 C语言源码

定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线.入口点为[0,0],既第一空格是可以走的路. Input 一个N × M的

栈的C语言源码

1.导言(为什么要用栈?) 通常来说,决定采用何种方式来存储数据是非常重要的,这样便于对数据检索时,数据会自动按照某种规定的顺序给出.栈和队列是检索数据的一种常用的数据结构.栈和队列是两种非常重要的数据结构,从数据结构来看,栈和队列也是线性表.是操作受限的线性表,栈只能在一端(栈顶)进行插入和删除,队列只能在一端(队尾)进行插入在另一端(队头)进行删除.但是从数据类型来说,栈和队列是和线性表不大相同两类重要的抽象数据类型.这里,首先重点介绍栈,以及栈的先关操作的c语言实现.栈是按照后进先出(LI