【问题标题】:Tricky interview puzzle棘手的面试难题
【发布时间】:2012-08-03 00:37:48
【问题描述】:

您有这段 Javascript 代码(即使语言选择无关紧要):

var arr = new Array(101);
for (skip = 1; skip <= 100; skip++) {
    for (i = 0; i <= 100; i+= skip) {
        arr[i] = !arr[i];
    }
}

很明显,这段代码运行后,数组中会有一堆真假值。如果 arr[i] 被触摸偶数次,则为假,否则为真。

问题是这些值形成什么模式?你能快速判断 arr[15] 是真还是假? arr[81] 呢?

我知道答案(当 x 是某个整数的平方时,arr[x] 为真),但我不明白我应该如何在面试中快速得出答案?

额外的问题是这段代码的时间复杂度是多少,假设你对 N 个数组元素执行此操作(我将在下面回答)?

【问题讨论】:

  • 不值得另一个答案,但要了解为什么谐波级数具有对数增长,您可以绘制 y = 1/x 和 y = 1/(x+1) 并使用一点微积分来证明n 次谐波数以 ln n 为界,以 ln (n + 1) 为界。

标签: algorithm math time-complexity calculus


【解决方案1】:

所有完美的正方形项目都是真的,所有其他的都是假的。

http://thedailywtf.com/Articles/Nerds,-Jocks,-and-Lockers.aspx

这可以通过以下事实来解释:完美正方形具有奇数个唯一因子,而所有其他正方形具有偶数个。这是因为完美平方的平方根只计为一个因素。

一个数字会针对它所具有的每个因素切换一次,例如:

12 -> 1, 2, 3, 4, 6, 12 -> an even number, so still false
16 -> 1, 2, 4, 8, 16 -> an odd number, so true

奖励:算法执行 n + n/2 + n/3 ...切换导致 O(n log n) 时间(在另一个答案中解释得更好)。

【讨论】:

  • 或许也可以解释一下您是如何获得奖金的答案的。 :)
  • @DennisMeng:我几乎感觉不好扯掉另一个答案。
  • 很公平,但最好补充一下为什么谐波级数具有对数增长。 (另外你可以相信其他答案)
【解决方案2】:

如果对 N 个元素执行此操作,将有 N + N/2 + N/3 + ... 操作。它是调和级数,级数的部分和呈对数增长。因此,时间复杂度为 O(n*log n)

【讨论】:

    【解决方案3】:

    所有带有整数平方的数字都为真,其他数字为假。

    证明:

    我们将看到只有奇数除以它们的数字才是正确的:

    表示数字 N > 0。

    根据代数中的一句话,有k个不同的素数p1,p2,...pk和非零整数m1 m2,...,mk

    这样:N = p1^m1 * p2^m2 ... pk^mk.

    因此,除以 N 的数字的个数 =

    (m1 + 1)(m2 + 1)...*(mk + 1)。那是来自组合学。

    这个数是奇数对于每个1 对于每个1存在n1,n2,。 ..,nk 个非零元素,例如 mj = 2nj,每个 1

    所以我们得到:

    N = p1^2n1 * p2^2n2 .. pk^2nk => N = (p1^n1 * p2^n2 ... pk^nk) ^2,如我们所愿。

    这是一个数学证明。

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2011-07-27
      • 1970-01-01
      • 2011-05-06
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多