yulu

普通PHP面试遇到的问题5

问题:

  1. 有两个数组A、B,A = {‘a’=>2,’c’=>7,’g’=>10….}, B = {‘d’=>5,’a’=>’2’,’b’=>3,’c’=>7….}找出其中相同的元素。
  2. 二分查找。
  3. redis的数据类型
  4. mysql垂直分表,水平分表。
  5. redis、mongo、memcached的优缺点。
  6. 第K大的数。

解析:

  1. 遍历数组就好了。
  2. 二分查找如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    function binarySearch($arr,$target){
    $left = 0;
    $right = count($arr) - 1;
    $mid = 0;
    while($left < $right){
    $mid = $left + (($right - $left) >> 1);
    if($arr[$mid] > $target){
    $right = $mid;
    }else if($arr[$mid] < $target){
    $left = $mid;
    }else{
    return $arr[$mid]
    }
    }
    }
  3. redis数据类型:string,list,set,hash,sortset

  4. mysql 垂直与水平分表:
    • 垂直分表:垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。通常按照以下原则:
      • 不常用的字段单独放在一张表
      • 把大字段单独拆分出来
      • 经常组合查询的放在一张表
    • 水平分表:水平拆分是指数据表行的拆分。可以把一个大表拆分成存储内容相同的许多小表。
  5. redis,memcached,mongodb的优缺点。
  6. 博客中有对于第K大的数的求解方案。