遇到的算法题--02(斗牛)
“斗牛”是一种热门的扑克游戏,每个人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(斗牛)相关推荐
- Java基础算法题(02):古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
查看所有50道基础算法题请看: Java的50道基础算法题 递归的方法 package Demo02Rabbits; import java.util.Scanner; public class Ra ...
- 剑指offer算法题02
写在前面 主要是题目太多,所以和前面的分开来记录. 有很多思路的图都来源于力扣的题解,如侵权会及时删除. 不过代码都是个人实现的,所以有一些值得记录的理解. 七.动态规划 1. 斐波那契数列 题目:h ...
- 字节跳动面试官:你离50w年薪就差答对了这个算法题!
我有个朋友,最近去头条面试,因为算法题没写出来,直接面挂了,搞得他非常郁闷. 众所周知,算法对程序员来说越来越重要了,但是总有人抱有一丝侥幸,不肯投入精力去学习,想着现在的工作中反正也用不到,等找工作 ...
- Java实现选最远距离的座位_LeetCode算法题-Maximize Distance to Closest Person(Java实现)...
这是悦乐书的第328次更新,第351篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第198题(顺位题号是849).在一排座位中,1表示一个人坐在该座位上,0表示座位是空的 ...
- largest number java_LeetCode算法题-Largest Number At Least Twice of Others(Java实现)
这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
- LeetCode算法题-Reverse Linked List(Java实现)
这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...
- java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...
- LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...
- leetcode 用java_LeetCode算法题-Heaters(Java实现)
这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...
最新文章
- 网络工程师课程---4、网络层(网关是什么)
- android上的i-jetty (1)环境搭建
- hdu-Calculation 2(欧拉函数)
- Go进阶(5): 数组与切片+多维数组+map切片
- Linux下C编程入门(.h文件,.c文件,以及多文件调用的方式)
- django-web聊天
- a4纸网页打印 table_打印模板不愁人,你还在打印单调的A4纸吗?
- 写html前端代码的软件_html用什么软件编写
- Visa 2021年Q1财报会议:计划与钱包和交易所合作,使用户能购买加密资产
- matlab做三次拉格朗日插值多项式_买菜必用的MATLAB拉格朗日插值函符号解输出
- Mathematica基础教程
- vue加载vue-amap 报错解决办法
- Android放大镜实现的两种方式
- 通过UEFI引导模式修改RAID卡jbod配置
- 局域网IP和外网(广域网)IP(又称公有IP和私有IP)
- python飞行棋项目
- 小满Router(第一章入门)
- 计算机排版打字操作,五笔字型与计算机排版培训教程2版 第9章 打字与排版的首选—Word 2007.ppt...
- BUUCTF Easy MD5
- 学习软件测试的一天(11.4)
热门文章
- a+b / a-b / a*b / a/b c++问题题解
- QT自定义控件-经纬度输入框
- 万字讲解WiFi为何物
- 计算机快捷方式图标没显示不出来,程序快捷方式不显示图标怎么办?Win10快捷方式图标变白纸解决方法...
- 搭建syslog日志服务器
- activiti工作流数据库表详细说明
- 507「LibreOJ NOI Round #1」接竹竿-DP
- html实现图片轮播切换箭头,Vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)_鹿岛_前端开发者...
- 思古解析js静态逆向分析
- windows10桌面壁纸的储存地址在哪里