“斗牛”是一种热门的扑克游戏,每个人5张牌,其中A当1,JQK都当10。要求:从5张牌中选出3张牌(必须刚好3张),如果存在3张牌加起来是10或者20或者30,就称为“有牛”,否则就是“没牛”。有牛的情况下,剩余两张牌加起来除以10后:
• 余数为0就是“牛牛”,是最大的一手牌。
• 如果余数为9就是“牛九”,是第二大的,依次类推,“牛一”就是最小。
• “有牛”都大于“没牛”。
• 两人都是没牛的情况下,比最大的一张牌谁大(注意A最大,2最小),最大一张牌一样则比较第二张牌,依次类推。
请写一段代码,验证两手牌哪一个最大。
输入是长度为5的两个字符串,表示两手牌。字符串内容是23456789TJQKA,注意为了让字符串长度一致,我们用T代表10。
请输出一个值:1表示第一手牌大,-1表示后一手牌更大,0表示一样大。

思路简述:解决该问题主要解决好两个问题,一个是是否有牛,第二个是剩余两个数在有牛情况下的余数,然后根据需要判断各种情况即可。此外,因为在没有牛的情况下,采用比较余数大小的方式

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int partition(vector<int>& arr,int start, int send){
    int s = start;
    int e = send;
    int temp = arr[send];
    while(s < e){
        while(s < e && arr[s] <= temp){
            s++;
        }
        if(s < e){
            arr[e] = arr[s];
        }

while(s < e && arr[e] >= temp){
            e--;
        }
        if(s < e){
            arr[s] = arr[e];
        }
    }
    arr[send] = temp;
    return s;
}

void quick_sort(vector<int>& arr,int start,int send)
{
    if(arr.size() <= 0)
        return;
    if(start >= send)
        return;

//枢纽
    int index = partition(arr,start,send);
    quick_sort(arr,start,index-1);
    quick_sort(arr,index+1,send);
}

vector<int> format2integer(const string& s){
    vector<int> result;
    for(int i = 0;i < s.length();i++){
        if(s[i] >= '2' && s[i] <= '9'){
            result.push_back(s[i] - '0');
        }else if(s[i] == 'A'){
            result.push_back(1);
        }else if(s[i] == 'T' || s[i] == 'J' || s[i] == 'Q' || s[i] == 'K'){
            result.push_back(10);
        }
    }
    //排序,方便后续无牛情况的比较
    quick_sort(result,0,result.size()-1);
    return result;
}

void check_result(const vector<int>& s,int* is_bull,int* yushu){
    int result = 0;
    int sum_for_three = 0;
    int sum_for_five = 0;
    //计算是否存在牛
    for(int i = 0;i < s.size(); i++){
        for(int j = i+1;j < s.size();j++){
            for(int k = j+1;k < s.size(); k++){
                int temp = s[i] + s[j] + s[k];
                if(temp - 10 == 0 || temp - 20 == 0 || temp - 30 == 0){
                    *is_bull = 1;
                    sum_for_three = temp;
                    cout<<"bull: "<<s[i]<<" "<<s[j]<<" "<<s[k]<<endl;
                    break;
                }
            }
        }
    }

for(int i=0; i < s.size(); i++){
        sum_for_five += s[i];
    }
    //计算剩余两个数的和除以10之后的余数
    if(*is_bull == 1){
        *yushu = (sum_for_five - sum_for_three)%10;
    }else{
        *yushu = -1;
    }
    cout<<"yushu: "<<*yushu<<endl;
}

void printf(vector<int>& n){
    for(int i=0;i<n.size();i++){
        cout<<n[i]<<'\t';
    }
    cout<<endl;
}

int check_method(const string& a,const string& b){
    //长度检查
    if(a.length() <= 0 && b.length() <= 0){
        return 0;
    }else if(a.length() <= 0){
        return -1;
    }else if(b.length() <= 0){
        return 1;
    }

//把字符串格式化为整形以方便比较
    vector<int> a_integer = format2integer(a);
    vector<int> b_integer = format2integer(b);

//是否有牛
    int is_a_bull = 0,is_b_bull =  0;

//余数
    int a_yushu = 0, b_yushu = 0;

//检查是否有牛,同时获取剩余两个数除10的余数
    check_result(a_integer,&is_a_bull,&a_yushu);
    printf(a_integer);
    cout<<is_a_bull<<" "<<a_yushu<<endl;
    check_result(b_integer,&is_b_bull,&b_yushu);
    printf(b_integer);
    cout<<is_b_bull<<" "<<b_yushu<<endl;

//有牛和无牛的检验
    if(is_a_bull == 1 && is_b_bull != 1){
        return 1;
    }else if(is_a_bull != 1 && is_b_bull == 1){
        return -1;
    }
    //都无牛的情况
    if(is_a_bull != 1 && is_b_bull != 1){
        int i=0,j=0;
        while(i < a_integer.size() && j < b_integer.size()){
            if(a_integer[i] == b_integer[j]){
                i++;
                j++;
            }else if(a_integer[i] > b_integer[j]){
                return 1;
            }else {
                return -1;
            }
        }
    }

//都有牛的情况
    if(a_yushu == b_yushu){
        return 0;
    }else if(a_yushu > b_yushu){
        return 1;
    }else {
        return -1;
    }
}

int main()
{
    string a=string("4579K");
    string b=string("AAAA2");
    cout<<check_method(a,b)<<endl;
    return 0;
}

遇到的算法题--02(斗牛)相关推荐

  1. Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

    查看所有50道基础算法题请看: Java的50道基础算法题 递归的方法 package Demo02Rabbits; import java.util.Scanner; public class Ra ...

  2. 剑指offer算法题02

    写在前面 主要是题目太多,所以和前面的分开来记录. 有很多思路的图都来源于力扣的题解,如侵权会及时删除. 不过代码都是个人实现的,所以有一些值得记录的理解. 七.动态规划 1. 斐波那契数列 题目:h ...

  3. 字节跳动面试官:你离50w年薪就差答对了这个算法题!

    我有个朋友,最近去头条面试,因为算法题没写出来,直接面挂了,搞得他非常郁闷. 众所周知,算法对程序员来说越来越重要了,但是总有人抱有一丝侥幸,不肯投入精力去学习,想着现在的工作中反正也用不到,等找工作 ...

  4. Java实现选最远距离的座位_LeetCode算法题-Maximize Distance to Closest Person(Java实现)...

    这是悦乐书的第328次更新,第351篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第198题(顺位题号是849).在一排座位中,1表示一个人坐在该座位上,0表示座位是空的 ...

  5. largest number java_LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  6. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  7. LeetCode算法题-Reverse Linked List(Java实现)

    这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...

  8. java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

  9. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

  10. leetcode 用java_LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

最新文章

  1. 网络工程师课程---4、网络层(网关是什么)
  2. android上的i-jetty (1)环境搭建
  3. hdu-Calculation 2(欧拉函数)
  4. Go进阶(5): 数组与切片+多维数组+map切片
  5. Linux下C编程入门(.h文件,.c文件,以及多文件调用的方式)
  6. django-web聊天
  7. a4纸网页打印 table_打印模板不愁人,你还在打印单调的A4纸吗?
  8. 写html前端代码的软件_html用什么软件编写
  9. Visa 2021年Q1财报会议:计划与钱包和交易所合作,使用户能购买加密资产
  10. matlab做三次拉格朗日插值多项式_买菜必用的MATLAB拉格朗日插值函符号解输出
  11. Mathematica基础教程
  12. vue加载vue-amap 报错解决办法
  13. Android放大镜实现的两种方式
  14. 通过UEFI引导模式修改RAID卡jbod配置
  15. 局域网IP和外网(广域网)IP(又称公有IP和私有IP)
  16. python飞行棋项目
  17. 小满Router(第一章入门)
  18. 计算机排版打字操作,五笔字型与计算机排版培训教程2版 第9章 打字与排版的首选—Word 2007.ppt...
  19. BUUCTF Easy MD5
  20. 学习软件测试的一天(11.4)

热门文章

  1. a+b / a-b / a*b / a/b c++问题题解
  2. QT自定义控件-经纬度输入框
  3. 万字讲解WiFi为何物
  4. 计算机快捷方式图标没显示不出来,程序快捷方式不显示图标怎么办?Win10快捷方式图标变白纸解决方法...
  5. 搭建syslog日志服务器
  6. activiti工作流数据库表详细说明
  7. 507「LibreOJ NOI Round #1」接竹竿-DP
  8. html实现图片轮播切换箭头,Vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)_鹿岛_前端开发者...
  9. 思古解析js静态逆向分析
  10. windows10桌面壁纸的储存地址在哪里