• 面试经历


          今早面了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;
    }
             通过这个面试题学到了等概率问题的各种解法,可以从把数从二进制角度看,可以用公式拼接出更大的等概率值域空间,也可以直接把概率问题转化到矩阵中解决。
  • 相关阅读:
    kubernetes(七)二进制安装-worker节点安装
    kubernetes(六)二进制安装-master节点安装
    B树
    Nginx反向代理无法达到效果原因
    AVL树
    平衡二叉搜索树
    二叉搜索树
    二叉树
    js-day06-jQuery事件和DOM操作-练习题
    js-day05-JSON-jQuery初体验
  • 原文地址:https://www.cnblogs.com/codingmylife/p/2632135.html
Copyright © 2020-2023  润新知