【微众银行2020实习笔试】博弈论:Cassidy和Eleanore是一对好朋友,她们经常会一起玩游戏。某一天她们玩了一个回文游戏。游戏规则是这样的:给出一个仅包含小写字母的字符串S,在每一个人的回合

题目描述

Cassidy和Eleanore是一对好朋友,她们经常会一起玩游戏。某一天她们玩了一个回文游戏。游戏规则是这样的:给出一个仅包含小写字母的字符串S,在每一个人的回合中,她们会进行两个操作:

  1. 尝试重新排列这个字符串,如果可以把这个字符串排列成回文字符串,则立即获胜。

  2. 否则,她们必须删掉字符串中的一个字符。

已知,Cassidy先手,在两个人都采取最佳策略的情况下,谁可以获胜。

输入
输入第一行仅包含一个正整数t,表示数据组数,(t<=10)

接下来有t行,每行有一个字符串S,表示一组测试数据。(|S|<=1000)

输出
对于每组数据输出一行,如果Cassidy获胜,则输出Cassidy,否则输出Eleanore

样例输入
2
aba
ab
样例输出
Cassidy
Eleanore

作者:Galliano、
链接:https://www.nowcoder.com/discuss/403152?type=all&order=time&pos=&page=1
来源:牛客网

/**
 * 微众 第 2 题,先手博弈问题
 */
public static void main2(String[] args) {
    Scanner sc = new Scanner(System.in);
    int t = Integer.parseInt(sc.nextLine());
    for (int i = 0; i < t; i++) {
        String str = sc.nextLine();
        System.out.println(whoWin(str));
    }
    sc.close();
}
private static String whoWin(String str) {
    String p1 = "Cassidy", p2 = "Eleanore"; // p1先手
    // 判断奇数次字符的个数
    // 若该个数为 奇数次,则无论如何都是 Cassidy 赢;
    // 若该个数为 偶数次,则无论如何都是 Eleanore 赢
    return ((oddCharNum(str) & 1) != 0) ? p1 : p2;
}
 
// 判断一个字符串的出现奇数次字符的个数
private static int oddCharNum(String str) {
    int[] arr = new int[26];
    for (int i = 0; i < str.length(); i++) arr[str.charAt(i) - 'a'] += 1;
 
    int oddNum = 0; // 奇数次字符的个数
    for (int num : arr) {
        if ((num & 1) != 0) oddNum++; // 该字符出现了奇次
    }
    return oddNum;
}
 
//  该方法没有被使用
// 判断一个字符串串能否被重排成回文串
private  static boolean canPalindromic(String str) {
    int[] arr = new int[26];
    for (int i = 0; i < str.length(); i++) arr[str.charAt(i) - 'a'] += 1;
 
    int count = 0;
    // 若有两个以上字符出现了奇次,则一定不是回文串,否则是回文串
    for (int num : arr) {
        if ((num & 1) != 0) { // 出现奇次的字符
            count++;
            if (count >= 2) return false;
        }
    }
    return true;
}
发布了115 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42956047/article/details/105398536