360 php 面试总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了360 php 面试总结相关的知识,希望对你有一定的参考价值。

一面没位置就没做面试题随便找个了地方面试,一面问了几个基础的东西。回答的不是很好  基础的好多东西都忘了。现在大概整理下

 

 

一个面试题:字符串翻转  写一个函数 可以把“360安全卫士” 转成“士卫全安063”

考察字符串编码问题。  思路:获取字符串长度 -> for循环截取 ->存入临时数据 -> 数组反向排序 ->数组转字符串

echo strlen("360安全卫士")  ;  //15  不指定编码的话一个汉字展3个字节   

 

echo  mb_srelen("360安全卫士",‘UTF-8‘);  //7  UTF-8 一个中文字符当作长度1

 

function str_rev_gb($str){
  //判断输入的是不是utf8类型的字符,否则退出
  if(!is_string($str)||!mb_check_encoding($str,‘UTF-8‘)){
    exit("输入类型不是UTF8类型的字符串");
  }
  $array=array();
  //将字符串存入数组
  $l=mb_strlen($str,‘UTF-8‘);//在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算
  for($i=0;$i<$l;$i++){
    $array[]=mb_substr($str,$i,1,‘UTF-8‘);
  }
  //反转字符串
  krsort($array);
  //拼接字符串
  $string=implode($array);
  return $string;
}

 

有一个数组[1,1,3,3,4]  顺序数量不定,找出不重复的那个值

php函数 array_count_value()

array_count_values() 函数用于统计数组中所有值出现的次数。

本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。

 

 

数据库索引的问题

表中USER上建立了索引问一下sql那些能用到索引
select * from table where USER = ‘1‘
select * from table where USER = ‘1‘ or USER =‘2‘
select * from table where USER = ‘1‘ or USER =‘2‘
select * from table where USER LIKE ‘%username‘ 
select * from table where USER LIKE ‘%username%‘
select * from table where USER LIKE ‘username%‘
select * from table where USER LIKE ‘usern%ame%‘

 

 

总结:

1. 为什么使用索引
在无索引的情况下,mysql会扫描整张表来查找符合sql条件的记录,其时间开销与表中数据量呈正相关。对关系型数据表中的某些字段建索引可以极大提高查询速度(当然,不同字段是否selective会导致这些字段建立的索引对查询速度的提升幅度不同,而且索引也并非越多越好,因为写入或删除时需要更新索引信息)。
对于MySQL的Innodb储存引擎来说,大部分类型的index均以B-Tree数据结构的变种B+Tree来存储(MEMORY类型的表还支持hash类型的索引)。B-Tree是数据库或文件系统中常用的一种数据结构,它是一种N叉平衡树,这种树结构保证了同层节点保存的key有序,对于某个节点来说,其左子树保存的所有key均小于该节点保存的 key,其右子树保存的所有key均大于该节点保存的key。此外,在工程实现上,还结合操作系统的局部性原理做了很多优化,总之,b-tree的各种特性或优化技巧能保证:1) 查询磁盘记录时,读盘次数最少;2) 任何insert和delete操作对树结构的影响均很小;3) 树本身的rebalance操作很高效。
2. MySQL使用索引的场景


MySQL在以下操作场景下会使用索引:
1) 快速查找符合where条件的记录
2) 快速确定候选集。若where条件使用了多个索引字段,则MySQL会优先使用能使候选记录集规模最小的那个索引,以便尽快淘汰不符合条件的记录。
3) 如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。
例如,若为某表创建了3个字段(c1, c2, c3)构成的联合索引,则(c1), (c1, c2), (c1, c2, c3)均会作为索引,(c2, c3)就不会被作为索引,而(c1, c3)其实只利用到c1索引。
4) 多表做join操作时会使用索引(如果参与join的字段在这些表中均建立了索引的话)
5) 若某字段已建立索引,求该字段的min()或max()时,MySQL会使用索引
6) 对建立了索引的字段做sort或group操作时,MySQL会使用索引
3. 哪些SQL语句会真正利用索引
从MySQL官网文档"Comparison of B-Tree and Hash Indexes"可知,下面这些类型的SQL可能会真正用到索引:
1) B-Tree可被用于sql中对列做比较的表达式,如=, >, >=, <, <=及between操作
2) 若like语句的条件是不以通配符开头的常量串,MySQL也会使用索引
比如,SELECT * FROM tbl_name WHERE key_col LIKE ‘Patrick%‘或SELECT * FROM tbl_name WHERE key_col LIKE ‘Pat%_ck%‘可以利用索引,而SELECT * FROM tbl_name WHERE key_col LIKE ‘%Patrick%‘(以通配符开头)和SELECT * FROM tbl_name WHERE key_col LIKE other_col(like条件不是常量串)无法利用索引。
对于形如LIKE ‘%string%‘的sql语句,若通配符后面的string长度大于3,则MySQL会利用Turbo Boyer-Moore algorithm算法进行查找。
3) 若已对名为col_name的列建了索引,则形如"col_name is null"的SQL会用到索引
4) 对于联合索引,sql条件中的最左前缀匹配字段会用到索引,示例请参考本文第2节第3条对联合索引的说明
5) 若sql语句中的where条件不只1个条件,则MySQL会进行Index Merge优化来缩小候选集范围

 

 

 

有一个是类里属性权限控制的问题

public 表示全局,类内部外部子类都可以访问;
private表示私有的,只有本类内部可以使用;
protected表示受保护的,只有本类或子类或父类中可以访问;

   <?
    //父类
    class father{
     public function a(){
      echo "function a";
     }
     private function b(){
      echo "function b";
     }
     protected function c(){
      echo "function c";
     }
    }
    //子类
    class child extends father{
      function d(){
        parent::a();//调用父类的a方法
      }
      function e(){
       parent::c(); //调用父类的c方法
      }
     function f(){
        parent::b(); //调用父类的b方法
      }
    }
    $father=new father();
    $father->a();
    $father->b(); //显示错误 外部无法调用私有的方法 Call to protected method father::b()
    $father->c(); //显示错误 外部无法调用受保护的方法Call to private method father::c()
    $chlid=new child();
    $chlid->d();
    $chlid->e();
    $chlid->f();//显示错误 无法调用父类private的方法 Call to private method father::b()
    ?>

 

 

 

 

 






























以上是关于360 php 面试总结的主要内容,如果未能解决你的问题,请参考以下文章

奇虎360PHP工程师2019年面试题和答案解析

360面试总结(Android)

360大牛:全面解读PHP面试

360大牛全面解读PHP面试

360大牛带你横扫PHP职场 全面解读PHP面试

360大牛全面解读PHP面试视频教程 php面试技巧教程 共10章