Java 笔试 练习题

package com.sanxiau.exam.exam11;

import java.util.*;

/*
    题目:
    String s1 = “1,2,3,4,5,6,7,8.9,10,11,12,13,14,15”;//代表全部参与抽奖的人员编号
    String s2 =”2,5,6”;//代表已经中奖的人员编号
    int number = 3;
    写一个函数,从s1中随机筛选出number个数字,且此数字不在s2中。返回一个字符串。
    请理解好需求,假设s1是全公司人员编号,s2是一等奖中奖人员,现在是要抽取n个二等奖。
    ps:(别人的双十一,买买买,楼主的双十一看代码。)

*/


public class demo1 {

    /**
     * @param scope  生成随机数范围
     * @param number  生成随机数个数
     * @param mppz  已中奖map集合
     * @return  返回中奖数组
     */
    // 不重复匹配已中奖人数,且随机不重复
    public static int[] Randoms(int scope,int number,Map<Integer, String> mppz) {
        Random rand = new Random(); //创建一个新随机数生成器
        int nu[] = new int[number];   //创建一个number位的数组,主要是保存结果,我需要number个不重复的随机值
        boolean[] bool = new boolean[scope];

        for (Map.Entry<Integer, String> mp : mppz.entrySet()) {
            Integer key = mp.getKey();
            bool[key] = true;
        }

        int randint = 0;
        for (int i = 0; i < number; i++) {
            do {
                randint = rand.nextInt(scope);
            } while (bool[randint]);
            bool[randint] = true;   //状态设置为true
            nu[i] = randint;
        }
        return nu;
    }


    public static String func(String s1,int number,String prize){
        String[] split = s1.split(",");
        String[] pz = prize.split(",");
        Map<Integer,String> mps1 = new HashMap<>();
        Map<Integer,String> mppz = new HashMap<>();
        StringBuffer res = new StringBuffer();

        // 将所有员工编号加入mps1集合
        for(int i=0;i < split.length;i++){
            mps1.put(i,split[i]);
        }

        // 将已中奖员工编号加入mppz集合
        for (Map.Entry<Integer, String> mp : mps1.entrySet()) {
            Integer key = mp.getKey();
            String value = mp.getValue();
            for (int i=0;i< pz.length;i++) {
                if(value.equals(pz[i])){
                    mppz.put(key,value);
                }
            }
        }

        // 获取随机数 不重复匹配已中奖人数,且随机不重复
        int[] randoms = Randoms(split.length, number, mppz);


        // 生成返回的员工编号
        for(int i=0;i<randoms.length;i++){
            if(i!=randoms.length -1){
                for (Map.Entry<Integer, String> mp : mps1.entrySet()) {
                    if(mp.getKey() == randoms[i]){
                        res.append(mp.getValue()+",");
                        break;
                    }
                }
            }else {
                for (Map.Entry<Integer, String> mp : mps1.entrySet()) {
                    if(mp.getKey() == randoms[i]){
                        res.append(mp.getValue());
                        break;
                    }
                }
            }
        }
        return res.toString();
    }


    public static void main(String[] args) {
        // 写一个函数,从s1中随机筛选出number个数字,且此数字不在s2中。返回一个字符串。
        String s1 = "1,2,3,4,5,6,7,8.9,10,11,12,13,14,15";
        String s2 = "2,5,6";//代表已经中奖的人员编号
        int number = 3;

        String res = func(s1, number, s2);
        System.out.println(res);

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值