阿里2017暑期实习生招聘技术岗编程题2--java实现

一、问题描述:

小张五一回家,父母给他安排了很多个相亲的姑娘,设姑娘的人数为N。

父亲负责安排约会,每次随机选择一个要相亲的对象, 母亲负责记录哪些姑娘已经约会过了。直到和所有的姑娘都约会完一遍以后,相亲才会结束。

这些天父母在吵架, 他们之间不会有任何言语沟通。所以父亲不知道那些姑娘已经约会过了。因此下次约会的对象很可能是以前已经约会过的。

请问,如果小张要把所有的姑娘都约会一遍, 那么平均需要约会多少个姑娘。

二、要求

输入:
共1行,给出N的值,正整数。

输出:
共一行,即平均约会次数,保留4位小数。

输入范例:
100

输出范例:
512.0000

三、解决

编程语言: java

思路:

N个女孩,序号为1~N,建立一个长度为N的数组,代表女孩的约会状态,0代表未和小张约过会,1代表已和小张约过会,将数组元素的初始值设为0。

设置一个变量记录约会次数。

每次随机生成一个1~N之间的数m,代表即将和序号为m的女孩约会,然后将该女孩的约会状态由0设为1;
然后对所有女孩的状态属性进行求和操作,若和为N,说明,小张已经和所有女孩约过会了,记下此时的约会次数。

对上述操作循环100次,然后根据每次循环下小张的约会次数,求取均值,即看作题目的答案。

package test;

import java.awt.Point;
import java.io.*;
import java.util.Scanner;

public class DateWithGirls {

    /**
     * @param args
     * @throws IOException 
     */

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);

        //用来接受控制台输入的女孩个数N
        int N=0;

        while(scanner.hasNext()){
            N = scanner.nextInt();
            int[] statusOfGirls= new int[N];

            //设置实验次数.
            int times = 100;
            //这个数组存储每次实验记录的约会次数
            int[] allCount = new int[times];

            //开始实验
            for(int t=0;t<times;t++){
                int count = 0;//计算约会次数
                int sum = 0;//对所有女孩的约会状态进行求和

                //设置女孩初始约会状态为0.
                for(int k=0;k<m;k++){
                    statusOfGirls[k] = 0;
                }

                boolean isContinue = true;
                while(isContinue){
                    sum = 0;
                    //随机生成要约会的女孩.
                    int ss = (int)Math.floor(Math.random()*m);
                    count+=1;//约会次数加1
                    //设置该女孩的约会状态为1.
                    statusOfGirls[ss] = 1;

                    //加总女孩的约会状态.
                    for(int j=0;j<m;j++){
                        sum+=statusOfGirls[j];
                    }

                    if(sum==m){
                        //如果所有女孩的约会状态都为1则终止循环
                        isContinue = false;
                    }
                    //System.out.println(ss);
                }
                allCount[t] = count;//将约会次数存入数组
            }

            int totalCount=0;
            for(int j=0;j<times;j++){
                totalCount+=allCount[j];
            }
            double meanCount = totalCount/times;
            System.out.printf("%.4f",meanCount);//格式化输出.

        }
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值