2017阿里巴巴实习生笔试题之扑克牌问题

阿里巴巴2016算法岗实习招聘(西安)在线笔试整理 2016年4月20日晚19点到21点,阿里巴巴2016算法岗实习招聘(西安)部分在线笔试题整理。 阅读详情

晚上刚参加2017阿里巴巴实习生的笔试,笔试分为两个部分,第一部分是选择题,第二部分是在线编程题。一做选择题感觉就被放了一个大招,自己则是一脸懵懵的状态:数据库,概率,排列组合,C++,Java,数据结构,逻辑题,Linux,Android,IOS等等见过的没见过的各种知识都涉及到了,开始的选择题就做了很长的时间,导致后面的选择题都是慌忙作答的。所以后面的编程题脑子也有些混乱,没能在规定的时间内做完(连第一道编程题都没测试就交卷了,所以我也不知道结果到底对不对)。

在这里先说说自己对第一道编程题的理解。其中第一个编程题大概是这样的(我没把原题保存,大概说下意思):说一副牌不包括大小王,有4种花色,13种点数。两个人玩这副扑克牌要制定一个新的规则——牌数随机(可以是一个人1张,另一个人38张这样的),然后出牌是可以出单张,两张或者三张(多张的牌必须是同样点数),花色不区分大小,只看点数大小(3最小,2最大;0代表10)。出牌规则是:如果第二个人手中有比第一个人更大的牌(点数更大,牌的数量需要一致,这点和我们平常玩的比较像),那就把这些更大的牌出了,如果有多种更大的牌,那就出这些牌里较小的牌(比如第一个人出了44,第二个人有3466557778,那第二个人就得出55);如果第二个人手中没有牌能够比第一个人出的牌大,那就出小而且数量最多的牌(比如第一个人出了22,第二个人有4567000JJQQQ,那第二个人就出000)。

输入两行,第一行代表自己手上拥有的牌,第二行代表对方出的牌。
输出一行,代表自己应该出的牌。

比如
输入:4567000JJQQQ 22
输出:000

[题目分析]

首先肯定是要对扑克牌做一个排序,那么如何排序呢?肯定不能做字符串的直接比较,因为这样2肯定比3小,而是需要定义自己的比较规则。这就可以使用到Comparator接口了,可以定义一个代表13个点数的String数组(也可以直接用一个代表所有点数的字符串“34567890JQKA2”),在compare方法中通过比较两个String在数组(字符串)中的索引得到这两个String的相对大小。

在排序完之后,可以通过分析对方出牌的点数p1和数量c1,去自己排序的手牌中寻找有没有合适的牌。我的想法是在遍历手牌的过程中将所有的点数放进一个LinkedHashSet中,得到不重复而且有序的点数。然后依次遍历这个LinkedHashSet,计算我方当前点数p2的数量c2,并比较p1和p2的大小。如果我方的点数比对方的点数小,那么就寻找长度最长且较小的点数;如果我方的点数比对方的点数大,那么比较数量c1和c2,如果我方在此点数的数量和对方数量相同甚至更大,那么就找到了比对方大且代价较小的牌。

具体代码实现如下:


import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

class ComparePoker implements Comparator<String>{

    /**
     * 查找点数索引,索引越大表示点数越大
     * @param key
     * @return
     */
    public static int indexOfArray(String key){
        //从小到大排序的点数
        final String[] points = 
            {"3","4","5","6","7","8","9","0","J","Q","K","A","2"};

        int index = 0;
        for(String str : points){
            index ++;
            if(str.equals(key)){
                return index;
            }
        }
        return -1;
    }

    /**
     * 若p1<p2则返回-1,相等则返回0,否则返回1
     */
    @Override
    public int compare(String p1, String p2) {
        // TODO Auto-generated method stub
        if(indexOfArray(p1) > indexOfArray(p2)){
            return 1;
        }
        else if(indexOfArray(p1) < indexOfArray(p2)){
            return -1;
        }else{
            return 0;
        }
    }
}


public class Main {

    /**
     * 处理手牌,找出应该出的牌
     * @param pocket
     * @param card
     * @return
     */
    String process(String pocket, String card) {
        List<String> pocketlist = StringtoList(pocket);
        List<String> cardlist = StringtoList(card);
        Collections.sort(pocketlist,new ComparePoker());//对自己手牌排序
//      Collections.sort(cardlist,new ComparePoker());//无需排序
        return findCard(pocketlist, cardlist);
    }

    /**
     * 找最合适的牌
     * @param myList
     * @param otherlist
     * @return
     */
    String findCard(List<String> myList,List<String> otherlist){
        //统计对方出牌信息
        int otherlength = otherlist.size();
        String othercard = otherlist.get(otherlength-1);
        int otherindex = ComparePoker.indexOfArray(othercard);

        //统计自己手牌点数
        HashSet<String> hashSet = new LinkedHashSet<>();
        for(String string : myList){
            hashSet.add(string);
        }
        Iterator<String> iterator = hashSet.iterator();

        int max = 0;//最终长度
        String finalstr = "";//最终单个点数信息

        while(iterator.hasNext()){
            //分析自己手牌点数信息
            String str = iterator.next();
            int myindex = ComparePoker.indexOfArray(str);
            int mylength = myList.lastIndexOf(str)-myList.indexOf(str)+1;

            if(myindex <= otherindex){//自己点数比对方点数小的情况,找最长且较小的牌
                if(mylength > max){
                    max = mylength;
                    finalstr = str;
                }
            }else{
                if(mylength >= otherlength){//自己点数比对方点数大的情况,只需找到长度>=对方长度的点数即可
                    max = otherlength;
                    finalstr = str;
                    break;
                }
            }
        }

        //根据牌的长度和点数决定出牌信息
        StringBuffer stringBuffer = new StringBuffer();
        for(int i = 0 ; i < max ; i++){
            stringBuffer.append(finalstr);
        }
        return stringBuffer.toString();
    }

    /**
     * 分割字符串
     * @param string
     * @return
     */
    List<String> StringtoList(String string){
        List<String> list = new ArrayList<>();
        char[] array = string.toCharArray();
        for(char s : array){
            list.add(String.valueOf(s));
        }
        return list;
    }

    /**
     * 主函数
     * @param args
     */
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String res;

        String regex = "[34567890JQKA2]+";
        String _pocket;
        try {
            _pocket = in.nextLine();
            if (!_pocket.replaceAll(regex, "").equals("")) {//判断是不是指定的牌
                return;
            }
        } catch (Exception e) {
            _pocket = null;
        }

        String _card;
        try {
            _card = in.nextLine();
            if (!_card.replaceAll(regex, "").equals("")) {//判断是不是指定的牌
                return;
            }
        } catch (Exception e) {
            _card = null;
        }

        Main mainclass = new Main();
        res = mainclass.process(_pocket, _card);
        System.out.println(res);
    }

}

只是为了实现功能,代码比较粗糙且未经过阿里系统测试,仅分享自己的想法供参考。作为编程菜鸟,经过这次的笔试后发现不足的地方太多太多了,还需要不断地改进和提升。这里附上自己曾经写过的一个小小的扑克牌程序:Java入门第三季–简易扑克牌游戏。

阿里笔试扑克牌题目 (记忆化回溯+剪枝) 阿里笔试扑克牌题目 阿里笔试扑克牌题目 (记忆化回溯+剪枝) ```python class Main(): def __init__(self): self.memo={} def main(self): lt=input().split(' ') lt=[int(i) for i in lt] def inter(lt,ind): # print (lt,ind) res=[] if ind>=len(lt): 立即下载

相关推荐

用Arduino和RC522模块DIY一个NFC门禁卡复制器(附完整代码)

本文详细介绍了如何利用Arduino和RC522模块DIY一个NFC门禁卡复制器,包括硬件连接、软件配置、数据读写技术及完整代码实现。通过本教程,电子爱好者可以深入了解NFC技术,并构建自己的智能门禁系统,适用于家庭安全、办公场所等多种场景。

weixin_33704591的博客 500

Java题目训练——完全数计算和扑克牌大小

输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER。扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A、2各4张,小王1张,大王1张。(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况 (如:将对子拆分成个子);输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如 4 4 4 4-joker JOKER。

lil_ghost_的博客 622

从零构建SOEM主站:基于STM32的EtherCAT伺服控制实战指南

本文详细介绍了如何从零构建基于STM32的SOEM主站系统,实现EtherCAT伺服电机的高精度控制。通过硬件选型、SOEM协议栈移植、PDO/SDO配置优化等实战步骤,帮助开发者掌握工业自动化中的关键运动控制技术,特别适用于23位编码器伺服电机的应用场景。

weixin_29186249的博客 666

德州扑克

德州扑克 五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一。 判断牌型: 牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。 牌型2,四条:四张相同数字 + 单张,如红桃A黑桃A梅花A方块A + 黑桃K。 牌型3,葫芦:三张相同数字 + 一对,如红桃5黑桃5梅花5 + 方块9梅花9。 牌型4,同花:同一花色,如方块3方块...

码农-007 7416

Pspice安装教程:Windows系统完整指南(含环境变量设置)

详细讲解在Windows系统中完成Pspice安装的全过程,涵盖安装步骤与关键的环境变量设置,帮助用户顺利运行仿真工具。适合初学者快速上手pspice安装教程中的核心环节。

weixin_42230607的博客 1176

Windows NPS与华为、华三、思科设备RADIUS认证实战指南

本文详细介绍了Windows NPS与华为、华三、思科设备RADIUS认证的实战配置指南。通过NPS服务器统一管理网络设备认证,实现企业级安全访问控制,涵盖基础配置、设备对接及故障排查方法,助力管理员提升网络安全管理效率。

weixin_29284201的博客 505

扑克牌问题

题目 有一堆扑克牌,将牌堆第一张放到桌子上,再将接下来的牌堆的第一张放到牌底,如此往复; 最后桌子上的牌顺序为: (牌底) 1,2,3,4,5,6,7,8,9,10,11,12,13 (牌顶); 问:原来那堆牌的顺序,用函数实现 代码实现 function sortPuke(arr) { let keyList = [];//arr对应的key let alenList = [];...

不负如来不负卿 1282

WPS Office 2026免费安装指南:AI办公与安全使用全解析

办公软件作为数字化办公的核心工具,其基本原理是通过文档处理、数据计算和演示展示等功能模块满足用户日常办公需求。随着人工智能技术的发展,现代办公软件逐步集成AI能力,通过自然语言处理和数据分析算法提升工作效率。在技术价值层面,优秀的办公软件不仅需要保持格式兼容性和跨平台同步能力,更要注重用户数据安全防护。从应用场景来看,无论是个人文档编辑、企业报表分析还是团队协作演示,办公软件都发挥着关键作用。WPS Office 2026作为国产办公软件代表,深度融合AI助手功能,支持智能写作和数据分析,同时通过官方免费策

weixin_30599769的博客 710

【推理题】扑克牌

结论:由于乙只知道花色,而他一早就知道甲不知道这张牌,说明这张牌的花色为红桃或者方块,因为这两种花色的牌都没有超出上面A、Q、4、5的范围;你从这16张牌中挑出一张牌来,并把这张牌的点数告诉甲,把这张牌的花色告诉乙。结论: 乙知道花色,他根据甲的话能推断出来是哪张牌,说明这张牌是方块5.结论:乙根据花色范围能确定这张牌,说明这张牌不是A;结论:这张牌点数不唯一。黑桃J、8、4、2、7、3。乙:我知道你不知道这张牌。乙:我知道你不知道这张牌。草花K、Q、5、4、6。甲:我不知道这张牌。甲:我不知道这张牌。

yzx3105的博客 1587

SAP 系统和银行系统通过 SM2 加密算法进行集成

SM2 是基于椭圆曲线离散对数问题(ECDLP)的一种公钥密码算法。椭圆曲线加密的核心原理,是利用了一个数学难题:在椭圆曲线群上,已知曲线上两点的运算结果,逆向推导出这两个点的具体信息是非常困难的。这样的复杂度使得基于椭圆曲线的密码体制比传统的 RSA 更加难以破解。在 SM2 加密中,公钥和私钥的生成与传统的椭圆曲线加密类似。选择一个椭圆曲线和一个基点 P。使用私钥 d,计算公钥 P’ = d * P。私钥 d 保密,而公钥 P’ 可公开分发,用于加密数据。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1211

阿里巴巴2020年研发实习生在线笔试题目

先说一下阿里爸爸的实习生招聘流程,分为提前批和正式批。提前批可以先进行面试,等到阿里校招系统开启后再走流程;正式批是先网上投递简历(或者内推),然后填写素质测评、进行在线笔试、初面、终面、发放offer。 我是找了蚂蚁集团-支付宝事业线-中台事业群-中台与业务技术事业部的一位技术专家内推,无奈自己太菜,带不动>-<。先说下上午的在线笔试,两道算法题,1个小...

pgs1004151212的博客 5850

别再用LabelImg了!我手搓了一个C#“一站式”YOLO工具箱,标注训练推理全搞定

这个工具箱目前已经在两个小型产线项目中试用,反馈非常好。效率提升:原本需要 2 天完成的“数据准备 - 训练 - 验证”循环,现在缩短到了 2 小时。门槛降低:产线技术员经过 10 分钟培训,就能独立完成新产品的模型迭代。当然,它还有改进空间未来计划集成主动学习功能:自动筛选出置信度低的图片,推荐优先标注。支持多模型管理:方便在不同产品型号间快速切换。增加PLC 通信模块:直接在推理界面配置 IO 信号,实现真正的软硬联动。最后想说工具的本质是服务于人。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 441

阿里巴巴笔试题-扑克牌

题目描述: 今天小强从一副扑克牌里拿出来一叠,其中包括A,2,3,...,10各四张,其中A代表1.他从这一叠中抽出一些牌给小明,并告诉小明,每次可以啊按照下列方式打出一些牌。 单牌:一张牌,例如3 对子:数字相同的两张牌,例如77 顺子:数字连续的五张牌,例如A2345 连对:数字连续的三个对子,例如334455 现在小强想知道最少可以打出多少次牌可以打光手中的牌。 输入描述: 一行十个空格分隔的整数,分别代表牌为A,2,3,...,10的个数。,数据保证手上至少有一张牌。 输出描述:

The Shawshank Redemption 826

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

阿里巴巴2017实习生招聘笔试题(算法工程师)

阿里巴巴2017实习生招聘笔试题

那年聪聪 6345

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

阿里巴巴 算法、数据工程师笔试题选解

阿里巴巴 算法、数据工程师笔试题选解 1、有三个结点的,可以构成多少个种叉树? 2、一副牌52张(去掉大小王),从中抽取两张牌,一红一黑的概率是多少? 编程题: 3、设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。情特别注意优化时间复杂度的常数。

i 綠茶 1394

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

阿里巴巴2020春招暑期实习笔试题

周五参加阿里暑期实习的笔试,一共两道编程题,一小时时间,在这里总结记录一下此次笔试题! 第一题 题目描述: 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出一张 出两张相同的牌(对子) 出五张顺子(如12345) 出三连对子(如112233) 给10个数,表示1-10每种牌有几张,问最少要多少次能出完? 题目解析: 该题目需要去考虑到多种状态,起初考虑使用DP求解,但是没有...

璟矢 5140

阿里巴巴2020.3.20春招暑期实习笔试题

参考自 :https://blog.youkuaiyun.com/qq_41999455/article/details/105040128 第一题 题目描述: 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出一张 出两张相同的牌(对子) 出五张顺子(如12345) 出三连对子(如112233) 给10个数,表示1-10每种牌有几张,问最少要多少次能出完? 题目解析: 采用暴力回溯法求解: 1、...

weixin_43958091的博客 843

阿里巴巴笔试题

闲着无聊逛博客的时候看到了这儿(http://blog.youkuaiyun.com/thebestdavid/article/details/11975809)的一些今年的面试题,试了下,前面几道都比较简单,但是可以说说扑克牌那道题目, 2、一副牌52张(去掉大小王),从中抽取两张牌,一红一黑的概率是多少? 看成排列题貌似更简单点,第一次红色,第二次黑色,或者第一次黑色,第二次红色——所以26/

wangmlabc的专栏 1668

2020年3月20日阿里内推笔试题

2020年3月20日阿里内推笔试题题目描述题目分析python代码题目描述python代码   因为第一批笔试的缘故加上自己家里买的摄像头还在路上,所以这一次的笔试我是没有参加的,根据网上整理出来的题目描述自己完成了这两道算法题。因为自己这样做,并没有得到验证,如果哪里有误的地方还希望大家能够积极指正。 题目描述 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出...

August-us的博客 3万+

2020阿里巴巴春招暑期实习笔试题(更新中)

2020.3.20 题目一 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌有几张,问最少要多少次能出完 #include <iostream> #include <vector> using namespace std; int Getmintimes(ve...

huangxi000的博客 2874

阿里巴巴笔试题选解

小题:(部分题目) 1、有三个结点的,可以构成多少个种叉树? 2、一副牌52张(去掉大小王),从中抽取两张牌,一红一黑的概率是多少? 编程题: 3、设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。情特别注意优化时间复杂度的常数。 4、已知三个升序整数数组a[l], b[m]和c[n]。请在三个数组中各找一个元素,是的组成...

dd1235555555的博客 167

阿里笔试题20春招笔试题汇总_python版本

正式批第一场 (2020/03/20) 1.扑克牌 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌有几张,问最少要多少次能出完 正式批第二场 (2020/03/23) 1.选队长 描述:给一个数字N(1<=N<=1e9),代表集合中有N个人,现在每次选若干个人出来,然后把这若干个人里面其中一个置为队长,这便是一种不同的选法,问你总共有多少种选法?问这样的组合的数量对10^9+7取

越吃越胖的博客 852

阿里巴巴JAVA工程师面试经验

阿里巴巴JAVA工程师面试经验(共14条)最近更新时间:2017-12-17 http://www.job592.com/pay/comms1938421_1353.html JAVA工程师面试经验(杭州) - 阿里巴巴 2016-08-16 | 内部推荐 面试过程: 最开始内推是免笔试的,所以投完简历一个星期之后就接到了第一轮面试的电话,因为人不在杭州,所以前面...

weixin_30906671的博客 168
上一篇: 10 条提升 Android 性能的建议
下一篇: Kaldi学习之如何运行脚本
llearner
博客等级 码龄11年 23粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值