三个算法题


题目

    小明今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....小明不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。小明决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们小明的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。

  翻译:输入5个数,判断是否是顺子,0可以当任何数。

思路

  思路一:

  顺子要素:除了0没有重复数字+(最大值-最小值<5)

  思路二:

  顺子要素:除了0没有重复数字+(排序后间隔数<0的个数)


package work;
import java.util.Arrays;
import java.util.Scanner;
/**
 * DELL
 * 2021/1/16
 * 14:01
 *输入5个数,判断是否是顺子,0可以当任何数。
 * 思路
 *   思路一:
 *   顺子要素:除了0没有重复数字+(最大值-最小值<5)
 *   思路二:
 *   顺子要素:除了0没有重复数字+(排序后间隔数<0的个数)
 */
public class OtherMethon1 {

    public static void main(String[] arg){
        Scanner sc = new Scanner(System.in);
        int[] numbers = new int[5];
        for (int i = 0; i < 5; i++) {
            System.out.print("请输入第" + (i + 1) + "个数");
            numbers[i] = sc.nextInt();
        }
        System.out.print(getResult1(numbers));
        System.out.print(getResult2(numbers));
    }
    static boolean getResult1(int[] numbers){
        //最大值减去最小值小于五
        int max = 0,min = 14;
        for(int i =0;i<5;i++){
            if(numbers[i] != 0){
                max = max > numbers[i] ? max : numbers[i];
                min = min < numbers[i] ? min : numbers[i];
            }
            if(max - min  < 5)return true;
        }
        return false;
    }
    static boolean getResult2(int[] numbers){
        Arrays.sort(numbers);
        for (int i = 1; i < 5; i++) {
            if(numbers[i] - numbers[i-1] > 1)return false;
        }
        return true;
    }
}

题目

   每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

思路

   思路一:用数组模拟

   思路二:用循环链表

package work;

import java.util.Arrays;
import java.util.Scanner;
import java.util.Random;
/**
 * DELL
 * 2021/1/16
 * 14:37
 *每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,
 * 今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。
 * 其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,
 * 他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1
 * 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,
 * 并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数..
 * ..这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿
 * 到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着
 * 想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
思路
   思路一:用数组模拟
   思路二:用循环链表
 *
 */
public class OtherMethon2 {
    public static void main(String[] args) {
        //输入游戏人数
        Scanner sc = new Scanner(System.in);
        int sum = sc.nextInt();
        //新建数组存放人的编号
        int[] member = new int[sum];
        for (int i = 0; i < sum; i++) {
            member[i] = (i + 1);
        }
        // m表示的是随机抽出的数,temp表示上一次随机抽出的数
        int m,temp;
        while(member.length > 1){
            Random r = new Random();
             m = r.nextInt(member.length);
             temp = 0;
            //如果从上一次的位置到数组的结尾一共包含的人数小于随机数,则执行以下语句
            if((member.length - temp - 1) > m){
                for(int i = m; i < member.length;i++){
                    if (i > 0) {
                        member[i - 1] = member[i];
                    };

                }
                // 将这次的随机数放入temp中
                temp = m;
                //以下情况是:随机数m超出从上一次的位置到数组的结尾一共包含的人数
            }else{
                //得到去除上一次的位置到数组的结尾一共包含的人数,得到新的m
                m = m - (member.length - temp);
                //将m位置移到m-1的位置,以此类推
                for(int i = m; i < member.length ;i++){
                    if(i > 0) {
                        member[i - 1] = member[i];
                    }else{
                        break;
                    }

                }
                //得到这一次的随机数m
                temp = m;
            }
            //数组的缩减
            member = Arrays.copyOf(member,member.length - 1);
        }
        //输出最后的一位同学
        System.out.print(member[0]);
    }
}

项目描述: *     共计21张牌。在{村民,狼人,守护,预言家,猎人,丘比特,长老,盗贼,替罪羊,女巫}随机生成12-18个身份 * (每个身份唯一,村民狼人除外)。有三张底牌,底牌必须不能出现盗贼身份。 * 玩家输入游戏人数:15 * 随机生成游戏人数配置: * 游戏配置:12-18人(大于18人或者小于12人,输出超出游戏人数范围) * 标准配置: * 人数(狼,民,神) * 18(5,7,5)人    5狼人     7村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1吹笛者 1盗贼      21张牌 * 17(5,6,6)人    5狼人     7村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼                    20张牌 * 16(5,6,5)人    5狼人     6村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼                    19张牌 * 15(5,5,5)人    5狼人     5村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼                    18张牌 * 14(4,5,5)人    4狼人     5村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊1 盗贼                    17张牌 * 13(4,5,4)人    4狼人     5村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 盗贼                             16张牌 * 12(4,4,4)人    4狼人     4村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 盗贼                             15张牌 * * 盗贼是一个特殊身份:当某位玩家获得盗贼牌的时候,可以翻开底牌三张选择底牌中自己想要的身份(有狼人要选狼人) * 要求: *     1.底牌可以没有狼人,如果有,最多只能有一个狼人; *     2.底牌不能有盗贼; *     3.输出如下: *         玩家手牌为: *        {01:村民,02:丘比特,03:盗贼,...  ,15:女巫} *     盗贼底牌为: *    {01:XX,02:XX ,03:XX}
package work;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

/**
 * DELL
 * 2021/1/15
 * 16:46
 * 项目描述:
 *     共计21张牌。在{村民,狼人,守护,预言家,猎人,丘比特,长老,盗贼,替罪羊,女巫}随机生成12-18个身份
 * (每个身份唯一,村民狼人除外)。有三张底牌,底牌必须不能出现盗贼身份。
 * 玩家输入游戏人数:15
 * 随机生成游戏人数配置:
 * 游戏配置:12-18人(大于18人或者小于12人,输出超出游戏人数范围)
 * 标准配置:
 * 人数(狼,民,神)
 * 18(5,7,5)人    5狼人     7村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1吹笛者 1盗贼      21张牌
 * 17(5,6,6)人    5狼人     7村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼                    20张牌
 * 16(5,6,5)人    5狼人     6村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼                    19张牌
 * 15(5,5,5)人    5狼人     5村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼                    18张牌
 * 14(4,5,5)人    4狼人     5村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 替罪羊1 盗贼                    17张牌
 * 13(4,5,4)人    4狼人     5村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 盗贼		                     16张牌
 * 12(4,4,4)人    4狼人     4村民        1预言家 1女巫   1丘比特 1守护 1猎人 1村长 1 盗贼		                     15张牌
 *
 * 盗贼是一个特殊身份:当某位玩家获得盗贼牌的时候,可以翻开底牌三张选择底牌中自己想要的身份(有狼人要选狼人)
 * 要求:
 * 	1.底牌可以没有狼人,如果有,最多只能有一个狼人;
 * 	2.底牌不能有盗贼;
 * 	3.输出如下:
 *         玩家手牌为:
 *        {01:村民,02:丘比特,03:盗贼,...  ,15:女巫}
 * 	盗贼底牌为:
 *    {01:XX,02:XX ,03:XX}
 */
public class Werewolf {
    public static void main(String[] args) {
        // 初始化变量
        Scanner sc = new Scanner(System.in);
        int peopleSum ;
        //输入合法游戏人数
        for(;;){
            System.out.println("请输入游戏人数 :");
            peopleSum = sc.nextInt();
            if(peopleSum >= 12 && peopleSum <= 18){
                break;
            }else{
                System.out.println("大于18人或者小于12人,输出超出游戏人数范围");
            }
        }
        // 获得标准配置
        String[] standardConfiguration = getStandardConfiguration(peopleSum);
        //输出格式调整
        for (int i = 0,j=1; i <standardConfiguration.length ; i++) {
//            if(i < peopleSum)System.out.print("玩家" + (i + 1) + ":");
//            else{System.out.print("盗贼底牌" + j++ + ":");}
            if(i == 0)System.out.print("玩家手牌为:" + '\n' + '\t');
            System.out.print((i <peopleSum  ?  ((Math.round(i)*10)/10 + 1) : j++));
            System.out.print(standardConfiguration[i]);
            if(i % 5 ==0 && i != 0 )System.out.print('\n');
            System.out.print('\t');
            if(i == peopleSum -1)System.out.print('\n' + "盗贼底牌为:" + '\n');

        }

    }
    //获得标准配置数组的算法
    public static String[] getStandardConfiguration(int peopleSum){
       ;
        switch (peopleSum){
            case 18: {
                String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
                        "村民6","村民7","预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊","吹笛者"};
                return getLastConfiguration(cards,peopleSum);
            }
            case 17: {
                String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
                        "村民6","村民7","预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
                return getLastConfiguration(cards,peopleSum);
            }
            case 16: {
                String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
                        "村民6","预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
                return getLastConfiguration(cards,peopleSum);
            }
            case 15: {
                String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
                        "预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
                return getLastConfiguration(cards,peopleSum);
            }
            case 14: {
                String[] cards= {"狼人1","狼人2","狼人3","狼人4","村民1","村民2","村民3","村民4","村民5","预言家1",
                        "女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
                return getLastConfiguration(cards,peopleSum);
            }
            case 13: {
                String[] cards= {"狼人1","狼人2","狼人3","狼人4","村民1","村民2","村民3","村民4","村民5","预言家1",
                        "女巫1","丘比特1","守护1","猎人1","村长1"};
                return getLastConfiguration(cards,peopleSum);
            }
            case 12: {
                // 一共15张牌,暂时去掉盗贼14张牌
                String[]  cards = {"狼人1","狼人2","狼人3","狼人4","村民1","村民2","村民3","村民4","预言家1","女巫1",
                        "丘比特1","守护1","猎人1","村长1"};
                return getLastConfiguration(cards,peopleSum);
            }
            //不存在的情况
            default:;
        }
        String a[] = new String[1];
        return a;

    }
    //检查生成的标准配置的底牌是否符合狼人数量小于等于1
    public static boolean lastThreeCheck(int peopleSum, String[] cards) {
        int temp = 0;
        for(int i = cards.length-1;i>(cards.length - 4);i--){
            if(cards[i] == "狼人1" || cards[i] == "狼人2"|| cards[i] == "狼人3"|| cards[i] == "狼人4"|| cards[i] == "狼人5")temp++;
        }
        if(temp <= 1)return true;
        else{
            return false;
        }
    }
    //算法复用,使用当前算法可以得到最后的标准配置数组
    public static String[] getLastConfiguration(String cards[],int peopleSum){
        Random r =new Random();
        //得到一个除了盗贼,其他角色都包括的数组,
        for (int i =0;;i++) {
            //获得一个0~13随机数
            int rd = r.nextInt(peopleSum+2);
            String temp = cards[rd];
            cards[rd] = cards[0];
            cards[0] = temp;
            if(i > (peopleSum + 2) *10){
                if(lastThreeCheck(peopleSum, cards)){
                    break;
                }
            }
        }
        String[] lastThreeCharacter = new String[3];
        System.arraycopy(cards,peopleSum-1,lastThreeCharacter,0,3);
        cards = Arrays.copyOf(cards,peopleSum);
        cards[peopleSum-1] = "盗贼";
        //除去底牌的数组随机
        for (int i =0;i<(peopleSum) * 10;i++) {
            //获得一个0~10随机数
            int rd = r.nextInt(peopleSum);
            String temp = cards[rd];
            cards[rd] = cards[0];
            cards[0] = temp;
        }
        cards = Arrays.copyOf(cards,peopleSum + 3);
        for(int i = cards.length-1,j=0;i>(cards.length - 4);i--,j++){
            cards[i] = lastThreeCharacter[j];
        }
        return cards;
    }

}


来自为知笔记(Wiz)

上一篇:运行效果演示-编写测试用例


下一篇:Redis 设计与实现 10:五大数据类型之有序集合