[CareerCup] 18.3 Randomly Generate Integers 随机生成数字

18.3 Write a method to randomly generate a set of m integers from an array of size n. Each element must have equal probability of being chosen.

这道题让我们从一个数组中随机取出m个数字,要求每个数字被取出的概率相同,其实这道题用的是之前那道18.2 Shuffle Cards的方法,同样我们可以用递归和迭代两种方法来做,递归的思路还用的回溯法,回溯到i+1==m的时候,取出数组中前m个数字放到结果res中,然后一层一层的返回,返回的过程中每次在[0, i]之间取出一个随机数,然后如果这个数小于m,那么更新res[k]的值为nums[i],这样相当于一种洗牌,这样保证了每个数被取出的概率都相同,参见代码如下:

解法一:

vector<int> pick(vector<int> &nums, int m, int i) {
    if (i + 1 < m) return {};
    else if (i + 1 == m) {
        vector<int> res(m);
        for (int k = 0; k < m; ++k) {
            res[k] = nums[k];
        }
        return res;
    } else {
        vector<int> res = pick(nums, m, i - 1);
        int k = rand() % (i + 1);
        if (k < m) res[k] = nums[i];
        return res;
    }
}

当然还有对应的迭代的写法,思路都一样:

解法二:

vector<int> pick(vector<int> &nums, int m) {
    vector<int> res(m);
    for (int i = 0; i < m; ++i) {
        res[i] = nums[i];
    }
    for (int i = m; i < nums.size(); ++i) {
        int k = rand() % (i + 1);
        if (k < m) res[k] = nums[i];
    }
    return res;
}

CareerCup All in One 题目汇总

时间: 2024-10-12 08:32:12

[CareerCup] 18.3 Randomly Generate Integers 随机生成数字的相关文章

随机生成数字验证码

protected void Page_Load(object sender, EventArgs e) { // 生成验证码 string checkCode = RandLetter(4); // 把新的验证码保存到Session中 Session["CheckCode"] = checkCode; // 输入验证码 CreateImages(checkCode); } /// <summary> /// 生成验证图片 /// </summary> ///

随机生成数字填充数组

随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路: 1.创建一个数组array[],长度为10. 2.在for循环中调用Math.Random()方法随机生成一定范围内的整数. 3.调用JOptionPane.showMessageDialog()方法将数组元素输出. 4.用for循环将数组元素相加,然后同步骤3. 程序流程图: 源程序代码: //随机生成10个数,填充一个数组,用消息框显示数组内容, //接着计算数组元素的和,将

java定时器Timer,TimerTask每隔一段时间随机生成数字

1:java.util.Timer类是一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行. 2:TimerTask类是由 Timer 安排为一次执行或重复执行的任务,因为有TimerTask类是一个抽象类,必须有其子类对其实现来完成定时任务的功能. TimerCallClient .java客户端代码: Timercallclient.java代码   package com.skyon.gd.test; import java.util.Timer; /**

[CareerCup] 18.4 Count Number of Two 统计数字2的个数

18.4 Write a method to count the number of 2s between 0 and n. 这道题给了我们一个整数n,让我们求[0,n]区间内所有2出现的个数,比如如果n=20,那么满足题意的是2, 12, 20,那么返回3即可.LeetCode上有一道很类似的题Factorial Trailing Zeroes,但是那道题求5的个数还包括了因子中的5,比如10里面也有5,这是两题的不同之处.那么首先这题可以用brute force来解,我们对区间内的每一个数字

iOS随机生成数字

有时候我们需要在程序中生成随机数,但是在Objective-c中并没有提供相应的函数,好在C中提供了rand().srand().random().arc4random()几个函数.那么怎么使用呢?下面将简单介绍: 1.  获取一个随机整数范围在:[0,100)包括0,不包括100 int x = arc4random() % 100; 2.  获取一个随机数范围在:[500,1000),包括500,包括1000 int y = (arc4random() % 501) + 500; 3.  获

随机生成数字

int number = 10;//number代表生成0-(number-1)的随机数 Random random = new Random(); int a=random.nextInt(number);

Python 随机生成数字,字符串,用户自动化生成数据

需要提前了解两个模块,string,random 1.关于string模块 import string print(string.punctuation) #输出为:!"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~ print(string.digits) #输出为:0123456789 print(string.ascii_letters) #输出为:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLM

随机生成数字(ashx文件,调用上篇所写发送邮件代码)

public void ProcessRequest(HttpContext context) { //邮件标题 string Email_Title = Dsis.Core.SysCore.PubFunction.DataFilter(Dsis.Core.SysCore.SysFunction.GetParameterInfo("Email_Title")["PValue"]); context.Response.ContentType = "text/

Android:随机生成算数四则运算简单demo(随机生成2~4组数字,进行加减乘除运算)

首先创建一个新的Android工程,下面是页面布局: Java代码: 我们先来分析一下如何完成的步骤: 1.首先,先完成生成随机数.(包括随机生成几组数字,范围为多少的数字,四则运算符号等): 2.要完成具体逻辑,先指定随机生成几组数字,然后再排列数字和四则运算符号 下面代码随机生成数字的每种情况只写了一种: private void question() { java.util.Random random=new java.util.Random(); //先指定随机生成几组数字(2~4):