综合题目

第一题(15 分)

需求某双色球系统,红球是 1-35 之间的数据,篮球是 1-15 之间的数据,一注双色球号码是由 6 个不重复的号码和 1 个篮球号码组成的。

具体功能点的要求如下:

  • 请随机一组双色球号码,6 个红球号码要求不重复,且升序排序输出,篮球号码放在最后面输出。
  • 假设上图展示的是中奖号码,請用程序判断出第一个功能随机出的双色球号码中了几个红球和几个篮球。
package Demo;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class work01 {
    public static void main(String[] args) {
       List<Integer> list = randomNumber();//封装得到的双色球号码
        List<Integer> list1 = new ArrayList<>();
        //将中奖双色球号码存入集合中
        Integer[] nums = {10,12,30,16,7,17,12};
        Collections.addAll(list1, nums);

        //输出双色球
        System.out.println("您的双色球号码为:");
        for (Integer i : list) {
            System.out.print(i+"\t");
        }
        System.out.println();
        //判断一组双色球号码中奖了几个红球和蓝球
        int[] count=numberCount(list,list1);
        System.out.println("中了"+count[0]+"个红球,"+"中了"+count[1]+"个蓝球");

    }
    //随机产生一组双色球号码,并且对红球号码进行排序
    public static List<Integer> randomNumber(){
        Random random = new Random();
        List<Integer> list = new ArrayList<>();
        while(list.size()<6) {
            int num = random.nextInt(35)+1;//随机生成1-35的红色号码球
            if(!list.contains(num)) {//如果双色球号码集合中不含该随机生成的数字就加入集合中
                list.add(num);
            }
        }
        //对红球号码集合进行排序
        list.sort(Integer::compareTo);

        list.add(random.nextInt(15)+1);//随机生成一个1-15的蓝色号码球
        return list;
    }
    //判断一组双色球号码中奖了几个红球
    public static int[] numberCount(List<Integer> list,List<Integer> list1){
        int countRed = 0;
        int[] count=new int[2];
        for (int i = 0; i < list1.size()-1; i++) {
            if(list.contains(list1.get(i))){
                countRed++;
            }
        }
        count[0]=countRed;
        if(list.get(6).equals(list1.get(6)))
            count[1]=1;
        return count;
    }
}

第二题(15 分)

需求目前有 100 名囚犯,每个囚犯的编号是 1-200 之间的随机数。现在要求依次随机生成 100 名囚犯的编号(要求这些囚犯的编号是不能重复的),然后让他们依次站成一排。(注:位置是从 1 开始计数的),接下来,国王命令手下先干掉全部奇数位置处的人。剩下的人,又从新按位置 1 开始,再次干掉全部奇数位置处的人,依此类推,直到最后剩下一个人为止,剩下的这个人为幸存者。

具体功能点的要求如下:请输出幸存者的编号,以及他第一次所占的位置值是多少。

评分细则

  • 能做出第一步:生产 100 个随机编号,且占位成功的,给 3 分。
  • 能成功删除奇数位置处的数据的,给 5 分。
  • 能正确获取结果的给 2 分。
package Demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class work02 {
    public static void main(String[] args) {
        //创建一个装囚犯的集合
        List<Integer> list = new ArrayList<>();
        Random random = new Random();
        while (list.size() < 100) {//装满100个囚犯为止,并且不重复
            int num = random.nextInt(200) + 1;
            if (!list.contains(num))
                list.add(num);
        }
        //设置一个克隆 最开始的囚犯集合 的集合
        List<Integer>list2 = new ArrayList<>(list);


        //每次将偶数位的囚犯加入幸存者集合中,并且更新囚犯集合为幸存者集合
        while (list.size() > 1) {
            //设置一个幸存者集合
            List<Integer> list1 = new ArrayList<>();
            for (int i = 1; i < list.size(); i += 2) {
                list1.add(list.get(i));
            }
            list = list1;//更新囚犯集合为幸存者集合
        }
        //在克隆的集合中寻找最后的幸存者的初始位置
        for (int i = 0; i <list2.size() ; i++) {
            if(list2.get(i).equals(list.get(0))) {
                System.out.println("幸存者编号为:" + list.get(0));
                System.out.println("幸存者第一次所占的位置为:" + (i + 1));
                return;
            }
        }



    }
}

第三题(20 分)

某班级要组织秋游活动,有四个景点的数据可以选择,依次是:“东湖”、“黄鹤楼”、“木兰文化区”、“归元禅寺”,每名学生最多可以选择两个想去的景点,最少要选择 1 个想去的景点,现在系统收集到了班级多名学生选择的信息如下。

String info = "10001,张无忌,男,2023-07-22 11:11:12,东湖-黄鹤楼#10002,赵敏,女,2023-07-22 09:11:21,黄鹤楼-归元禅寺#10003,周芷若,女,2023-07-22 04:11:21,木兰文化区-东湖#10004,小昭,女,2023-07-22 08:11:21,东湖#10005,灭绝,女,2023-07-22 17:11:21,归元禅寺" ;

新建测试类,在类中书写 main 方法,在方法中完成如下业务逻辑:

  • 业务一:
    • 需要你解析上面的字符串,获取里面的用户数据,并封装到 Student 对象中
    • 多个 Student 对象在添加到 List集合中
    • 注意:
      • 字符串中的规则如下,多个用户用 #拼接,用户的信息之间用,拼接,多个景点是用 - 拼接的。
      • 其中用户的 id 和选择时间是需要进行类型转换的,其中 id 需要将 String 转成 Long,选择时间需要将 String 转成 LocalDateTime。
  • 业务二:
    • 遍历上面获取的 List集合,统计里面每个景点选择的次数,并输出 景点名称和选择的次数。
  • 业务三:
    • 请用程序计算出哪个景点想去的人数最多,以及哪些人没有选择这个最多人想去的景点。
package Demo;

import java.util.*;

public class work03 {
    public static void main(String[] args) {
        String info="10001,张无忌,男,2023-07-22 11:11:12,东湖-黄鹤楼#10002,赵敏,女,2023-07-22 09:11:21,黄鹤楼-归元禅寺#10003,周芷若,女,2023-07-22 04:11:21,木兰文化区-东湖#10004,小昭,女,2023-07-22 08:11:21,东湖#10005,灭绝,女,2023-07-22 17:11:21,归元禅寺";
       //设置一个map集合来记录景点及其被选择的次数
        Map<String, Integer> places= new HashMap<>();
        places.put("东湖", 0);
        places.put("黄鹤楼", 0);
        places.put("木兰文化区", 0);
        places.put("归元禅寺", 0);

        List<Student> list=new ArrayList<>();
        //将字符串根据“#”分割为一个字符串数组
        String[] students=info.split("#");
        //将字符串数组中的内容根据“,”填充为学生对象,并且加入学生对象集合中
        for (String student : students) {
            Student stu = new Student(student.split(","));
            list.add(stu);

        }
        //遍历list学生集合
        System.out.println("所有学生信息为:");
        for (Student student : list) {
            System.out.println(student+"\t");//打印所有学生对象的信息
            //设置一个字符串数组来保存学生选择的多个景点
            String[] singlePlace=student.getPlace().split("-");
            //遍历当前学生选择的这个景点数组
            for (String str : singlePlace) {
                if(places.containsKey(str)){
                    places.put(str,places.get(str)+1);//如果学生选择的景点是四大景点之一,就将map集合中该景点被选择的次数加1
                }
            }
            }
        //输出每个景点及其被选择的次数
        places.forEach((place,count)-> System.out.println(place+"被选择"+count+"次"));
        //获取被选择最多次数的景点
        int countMax=Collections.max(places.values());

        //创建一个list集合存储被选择最多的景点名称
        List<String> placeName=new ArrayList<>();
        for(Map.Entry<String, Integer> entry:places.entrySet()){
            if(entry.getValue()==countMax){//如果Map集合中景点被选择的次数等于最多选择次数,就将该景点名称加入list集合中存储起来
                placeName.add(entry.getKey());
                System.out.println("最火爆的景点是"+entry.getKey());
            }

        }
        for (String name : placeName) {
            for (Student student : list) {
                if(!student.getPlace().contains(name)){
                    System.out.println(student.getName()+"没有选择最火爆的景点");
                }
            }
        }
        }
    }

第四题(20 分)

需求现在有 n 个物品,每个物品都是液体,液体存在重量和价值,现在要求你只能从如下提供的液体中总共取走 10 升液体,每种液体每次可以不拿,全拿,或拿一部分,问取走的 10 升液体的最高价值是多少。请用程序来完成。

名称 重量 (升) 总价值
4 24
牛奶 8 160
五粮液 2 4000
可乐 6 108
茅台 1 4000

具体功能点的要求如下1、请按照如上数据的顺序,将每种液体数据依次添加到程序中来 (注意:可以创建对象封装每种液体数据,并添加到 ArrayList 集合中去)2、请用程序计算出取的 10 升液体的最高价值是多少?以及 10 升液体具体是哪些液体组成,各自取了多少。

package Demo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class work05 {
    public static void main(String[] args) {
        //创建list集合将物品名称及物品对象加入集合
        List<Water> list = new ArrayList<>();
        list.add(new Water("水", 4, 24));
        list.add(new Water("牛奶", 8, 160));
        list.add(new Water("五粮液", 2, 4000));
        list.add(new Water("可乐", 6, 108));
        list.add(new Water("茅台", 1, 4000));

        //按照单价排序,降序排序
        list.sort(Comparator.comparingInt(Water::value).reversed());
        //打印排序后的液体集合
        list.forEach(System.out::println);
        int myWeight = 10;//初始容量为10
        int maxValue = 0;//记录最大价值


        for (Water water : list) {//遍历排序后的液体
            if (myWeight <= 0) break;//前提是容器容量不为0
            if (water.getWeight() <= myWeight) {//如果液体容量小于等于容器容量,就全部倒入容器,并且把价值加入maxValue
                System.out.println("提取了" + water.getName() + water.getWeight() + "升");
                myWeight -= water.getWeight();
                maxValue += water.getSumValue();
                water.setWeight(0);
            } else if (water.getWeight() > myWeight) {//如果液体容量大于容器容量,就倒入容器大小的液体,并且把价值加入maxValue
                System.out.println("提取了" + water.getName() + myWeight + "升");
                maxValue += myWeight * water.value();
                water.setWeight(water.getWeight() - myWeight);
                myWeight = 0;
            }
        }


        System.out.println("取出10升液体的最高价值为:" + maxValue);

    }
}

//创建一个物品类
@Data
@AllArgsConstructor
@NoArgsConstructor
class Water {
    private String name;
    private int weight;
    private int sumValue;//总价值

    public int value() {
        return sumValue / weight;
    }
}
posted @ 2025-12-13 22:38  芒果学代码  阅读(2)  评论(0)    收藏  举报