zoukankan      html  css  js  c++  java
  • 面试经历

          今早面了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;
    }
             通过这个面试题学到了等概率问题的各种解法,可以从把数从二进制角度看,可以用公式拼接出更大的等概率值域空间,也可以直接把概率问题转化到矩阵中解决。
  • 相关阅读:
    心得
    第七章
    第六章
    第五章
    第四章
    第三章
    第二章
    第一章
    实验2(4)
    实验2(3)
  • 原文地址:https://www.cnblogs.com/codingmylife/p/2632135.html
Copyright © 2011-2022 走看看