THU的有趣的OI面试题

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

V1

       ~~~~~~       来源:THUWC2017

题目

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

解法

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

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。

你可能感兴趣的:(算法_神奇的脑洞)