yulu

普通PHP面试遇到的问题3

搜狗社招问题:

  1. 问以下代码输出是什么,为什么?

    1
    2
    3
    <?php
    setcookies("name","soso");
    var_dump($_COOKIE['name']);
  2. 一个数组里面有2n+1个元素,其中n个元素重复出现2次,1个元素只出现了1次,找出这个元素的最快时间复杂度是多少。n=1….n 如果有3n+1个元素呢?

  3. 给定一个数组例如:array(‘apple’=>1,’banana’=>4,’pear’=>1,’peach’=>3) 对数组进行排序,如果值相等则按键的大小来排序。
  4. 游戏A,B在10月1号-10月10号各要发放n个礼包;然后按不同的时间段发放礼包,每次发放的个数是固定的。比如A每天在7:00-9:00,没小时发放300个;Bi在周六12:00,每分钟发放50个。如何规定时间段内的礼包没有被领完,则将礼包累计到下一次发放。每个人对每款游戏只能领取一次礼包。设计数据库以及程序(伪代码)。

面试:
问一些在工作中遇到的问题,以及如何解决。

总结

  1. 我当时给出的答案是sting(“soso”),但貌似不对,应该是name undefined。因为只是设置了cookie的值,其实还没有生效吧。
  2. 当有2n+1个元素的时候:

    • 我直接用了异或去处理。将数组异或一遍,最后得到的值就是要找的元素。时间复杂度是O(n);
    • 其实面试官真正想得到的答案是这样的:将1到n相加得到和tmp,将给出的数组元素相加得到和sum,然后将 tmp * 2 - sum 结果就是多出来的数。这样时间复杂度也是O(n)
      当有3n+1个元素的时候:
    • 其方法和刚才算2n+1的时候是一致的,只不过是将tmp * 3 - sum 得到的结果再除以2即为只出现了一次的元素。
  3. 这个写一个快排就好了。

  4. 这个使用redis+mysql来完成,还有就是实现异步任务。