饿了么笔试题:看似简单,难倒一批人
作为互联网行业的从业者,不少人看到这道题目时,也许会觉得这是一道非常简单的编程题目,正好可以利用这道题目来练手,提高自己的编程能力。可是,随着实际的操作,不少人发现这道看似简单的题目实际上非常具有挑战性,很难通过。
那么,这道题目到底有哪些难点呢?其实,主要的问题在于对题目的理解。如果不能正确地理解题目的要求,那么无论怎么编程,最终的结果也很难完全正确。因此,在解答这道题目时,我们需要仔细地阅读题目,理解题目的要求,然后再制定相应的计划和措施。
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数组存储数和对应的概率值。
接着,利用随机数和概率值之间的关系,采用“轮盘赌”算法,实现随机选择一个数的功能。
最后,整合上述算法思路,编写出完整的程序代码。
在这个过程中,我们需要注重对题目要求的仔细分析,以及对代码实现的细节把握。只有这样,才能顺利地解决这道看似简单、难倒一批人的饿了么笔试题。