THU的有趣的OI面试题

  由于太过蒟蒻,没能去thuwc2017。
  从大神口中得知了一些比较有趣的面试题,于是想做个收集。

V1

  来源:THUWC2017

题目

  给你一个长度为 n 的 01 串,求出 1 的个数。

解法

  扫一遍是 O(n) 的。忽略读入的话是可以更快的。
  压位,比如我把它 16 位压一次,然后做一个 2^16 的预处理,这样时间就变成 n/16 了。
  当然,作为面试你还可以这么回(zhuang)答(bi):“我们可以使用分布式算法,有多少个 node,我们就把这个串平均分成那么多份,然后每个 node 传一份。这样时间就是 $O(\frac{n}{num(node)})。$”

V2

  来源:THUWC2017

题目

  给定一个随机生成器,它有 p 的概率返回 0,(1-p) 的概率返回 1,其中 p∈(0, 1)。
  现在你要构造一个使用这个生成器的算法,使得返回 0 和返回 1 的概率相等。

解法

  这题关键是要找到两个东西,它们发生的概率是相同的。
  于是我们发现,生成 0 1 的概率跟生成 1 0 的概率是相同的,都是 p(1-p)。
  因此我们随机生成两个数 x 和 y,直到 x≠y 为止,然后返回 x。

  (个人感觉这个题妙啊。。。)

V3

  来源:THUSC2016

题目

  有一个长度为奇数的数列,其中只有 1 个数与其他不同。要求你找出这个数。

解法

  最直观的是扫一遍,若当前的数与前一个不相同,则根据前后判断一下。
  事实上有常数更小的方法,把序列异或起来,得到的就是答案。这样可以用位运算代替 if。