小编典典

棘手的Google面试问题

algorithm

我的一个朋友正在面试工作。采访中的一个问题让我思考,只想要一些反馈。

有2个非负整数:i和j。给定以下方程式,找到一种(最佳)解决方案以对i和j进行迭代,以对输出进行排序。

2^i * 5^j

因此,前几轮如下所示:

2^0 * 5^0 = 1
2^1 * 5^0 = 2
2^2 * 5^0 = 4
2^0 * 5^1 = 5
2^3 * 5^0 = 8
2^1 * 5^1 = 10
2^4 * 5^0 = 16
2^2 * 5^1 = 20
2^0 * 5^2 = 25

尝试尝试,我看不到任何模式。你的想法?


阅读 239

收藏
2020-07-28

共1个答案

小编典典

Dijkstra在“编程纪律”中得出了雄辩的解决方案。他将问题归因于汉明。这是我对Dijkstra解决方案的实现。

int main()
{
    const int n = 20;       // Generate the first n numbers

    std::vector<int> v(n);
    v[0] = 1;

    int i2 = 0;             // Index for 2
    int i5 = 0;             // Index for 5

    int x2 = 2 * v[i2];     // Next two candidates
    int x5 = 5 * v[i5];

    for (int i = 1; i != n; ++i)
    {
        int m = std::min(x2, x5);
        std::cout << m << " ";
        v[i] = m;

        if (x2 == m)
        {
            ++i2;
            x2 = 2 * v[i2];
        }
        if (x5 == m)
        {
            ++i5;
            x5 = 5 * v[i5];
        }
    }

    std::cout << std::endl;
    return 0;
}
2020-07-28