饿了么笔试题,看似简单,难倒一批人

饿了么笔试题:看似简单,难倒一批人

作为互联网行业的从业者,不少人看到这道题目时,也许会觉得这是一道非常简单的编程题目,正好可以利用这道题目来练手,提高自己的编程能力。可是,随着实际的操作,不少人发现这道看似简单的题目实际上非常具有挑战性,很难通过。

那么,这道题目到底有哪些难点呢?其实,主要的问题在于对题目的理解。如果不能正确地理解题目的要求,那么无论怎么编程,最终的结果也很难完全正确。因此,在解答这道题目时,我们需要仔细地阅读题目,理解题目的要求,然后再制定相应的计划和措施。

1.题目要求分析

那么,这道题目到底要求我们做些什么呢?事实上,饿了么笔试题是一道要求编写程序的题目,它要求我们利用Java语言编写程序,实现一个只含有叶子结点的数的列表。其中,每个数都要有对应的概率值。同时,这个程序还需要提供一个函数,用于随机选择一个数,其选择的概率要与该数的概率值成正比。

2.算法思路分析

要解决这道题目,我们首先需要思考的是如何存储只含有叶子结点的数的列表,以及每个数对应的概率值。在这里,我们可以采用Java中的一个数据结构——数组,来存储这些数和对应的概率值。具体来说,我们可以先定义两个数组——一个数组存储这些数,另一个数组存储这些数对应的概率值。

private int[] nums;   // 存储数的数组

private double[] probs; // 存储概率值的数组

接着,我们可以在程序中提供一个函数,用于初始化这两个数组:

/**

* 初始化函数

* @param nums 存储数的数组

* @param probs 存储概率值的数组

*/

public void init(int[] nums, double[] probs) {

this.nums = nums;

this.probs = probs;

}

然后,我们还需要提供一个函数,用于随机选择一个数。为了保证选择的概率与数对应的概率值成正比,我们可以采用一种叫做“轮盘赌”的算法。具体的思路如下:

首先,根据数对应的概率值,计算出总概率值sum。

然后,从0到sum之间随机生成一个数rand。

接着,从第一个数开始,依次累加数对应的概率值,直到累加的概率值大于rand为止。此时,所选的数就是随机选择的数。

具体的实现方式如下:

/**

* 随机选择一个数

* @return 所选择的数

*/

public int pick() {

// 计算出概率值之和

double sum = 0;

for (double prob : probs) {

sum += prob;

}

// 随机生成一个概率值

double rand = Math.random() * sum;

// 从第一个数开始,累加数对应的概率值

int i = 0;

double cur = 0;

while (i < probs.length) {

cur += probs[i];

if (cur > rand) {

return nums[i];

}

i++;

}

return nums[nums.length - 1];

}

3.代码实现

最终,我们可以把上述算法思路整合起来,编写出最终的程序代码:

public class RandomPick {

private int[] nums; // 存储数的数组

private double[] probs; // 存储概率值的数组

/**

* 初始化函数

* @param nums 存储数的数组

* @param probs 存储概率值的数组

*/

public void init(int[] nums, double[] probs) {

this.nums = nums;

this.probs = probs;

}

/**

* 随机选择一个数

* @return 所选择的数

*/

public int pick() {

// 计算出概率值之和

double sum = 0;

for (double prob : probs) {

sum += prob;

}

// 随机生成一个概率值

double rand = Math.random() * sum;

// 从第一个数开始,累加数对应的概率值

int i = 0;

double cur = 0;

while (i < probs.length) {

cur += probs[i];

if (cur > rand) {

return nums[i];

}

i++;

}

return nums[nums.length - 1];

}

}

4.解题思路总结

通过对这道题目的分析,我们可以得出以下解题思路:

首先,阅读题目体、明确题目要求。

然后,采用Java数组存储数和对应的概率值。

接着,利用随机数和概率值之间的关系,采用“轮盘赌”算法,实现随机选择一个数的功能。

最后,整合上述算法思路,编写出完整的程序代码。

在这个过程中,我们需要注重对题目要求的仔细分析,以及对代码实现的细节把握。只有这样,才能顺利地解决这道看似简单、难倒一批人的饿了么笔试题。

后端开发标签