面试经历

      今早面了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;
}
         通过这个面试题学到了等概率问题的各种解法,可以从把数从二进制角度看,可以用公式拼接出更大的等概率值域空间,也可以直接把概率问题转化到矩阵中解决。
原文地址:https://www.cnblogs.com/codingmylife/p/2632135.html