今早面了XX第一轮技术面,第一题就挂掉了。以前没做过这类型的题,把主要精力集中到了二叉树、图、搜索排序以及动态规划问题上了。因为看过N多的面经,都说XX更注重Coding,从我经历来看显然不是。这里记录下面试题以便查找:
有个函数rand5等概率生成1,2,3,4,5,实现rand7。如果没做过类似题型的,应该没什么思路。在面试官的层层诱导下,揭开面试官的猥琐解法:
// Gen 0, 1 equal probability
int rand01()
{
int i = rand5();
while (i > 4) {i = rand5();}
return i % 2;
}
// Gen 0, 1, 2, 3, 4, 5, 6, 7 equal probability
int rand07()
{
return rand01() << 2 + rand01() << 1 + rand01();
}
// Gen 1, 2, 3, 4, 5, 6, 7 equal probability
int rand7()
{
int i = rand07();
while (i == 0) {i = rand07();}
return i;
}
我想说,面试官的解法真心不直观。随后,跟同学同事讨论,又得到另外两种解法:
int rand7()
{
while (true)
{
int i = 5 * (rand5() - 1) + (rand5() - 1);
if (i < 21) return i % 7 + 1;
}
}
这种解法相对直观一些,但是同事给出了直观又通用解法:
int matrix[5][5];
memset(matrix, 0, sizeof(matrix));
// Set matrix with num 1-7, each num has the same count.
for (int i = 1; i <= 7; ++i)
{
for (int j = 0; j < 3; ++j)
{
*matrix++ = i;
}
}
int rand7()
{
int i;
do
{
i = matrix[rand5() - 1][rand5() - 1];
} while (i == 0);
return i;
}