PHP面试常用算法(推荐)


Posted in PHP onJuly 22, 2016

一、冒泡排序

基本思想:

对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。

//冒泡排序

<?php

  function mysort($arr)
  {
    for($i = 0; $i < count($arr); $i++)
    {
      $isSort = false;
      for ($j=0; $j< count($arr) - $i - 1; $j++) 
      {
        if($arr[$j] < $arr[$j+1])
        {
          $isSort = true;
          $temp = $arr[$j];
          $arr[$j] = $arr[$j+1];
          $arr[$j+1] = $temp ;
        }
      }
      if($isSort)
      {
        break;
      }
    }
    return $arr;
  }

  $arr = array(3,1,2);
  var_dump(mysort($arr));
?>

二、快速排序

基本思想:

在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。

//快速排序

<?php
  //快速排序
    function quick_sort($arr) 
    {
      //先判断是否需要继续进行
      $length = count($arr);
      if($length <= 1) 
      {
        return $arr;
      }
    
      $base_num = $arr[0];//选择一个标尺 选择第一个元素

      //初始化两个数组
      $left_array = array();//小于标尺的
      $right_array = array();//大于标尺的
      for($i=1; $i<$length; $i++) 
      {      //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
        if($base_num > $arr[$i]) 
        {
          //放入左边数组
          $left_array[] = $arr[$i];
        } 
        else 
        {
          //放入右边
          $right_array[] = $arr[$i];
        }
      }
      //再分别对 左边 和 右边的数组进行相同的排序处理方式
      //递归调用这个函数,并记录结果
      $left_array = quick_sort($left_array);
      $right_array = quick_sort($right_array);
      //合并左边 标尺 右边
      return array_merge($left_array, array($base_num), $right_array);
    }

    $arr = array(3,1,2);
    var_dump(quick_sort($arr));

?>

三、二分查找

基本思想:

假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)

//二分查找

<?php
  //二分查找
  function bin_search($arr,$low,$high,$k)
  {
    if($low <= $high)
    {
      $mid = intval(($low + $high)/2);
      if($arr[$mid] == $k)
      {
        return $mid;
      }
      else if($k < $arr[$mid])
      {
        return bin_search($arr,$low,$mid-1,$k);
      }
      else
      {
        return bin_search($arr,$mid+1,$high,$k);
      }
    }
    return -1;
  }

  $arr = array(1,2,3,4,5,6,7,8,9,10);

  print(bin_search($arr,0,9,3));
?>

四、顺序查找

基本思想:

从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。

//顺序查找 

<?php
  //顺序查找
  function seq_search($arr,$n,$k)
  {
    $array[$n] = $k;
    for($i = 0;$i < $n; $i++)
    {
      if($arr[$i] == $k)
      {
        break;
      }
    }

    if($i < $n)
    {
      return $i;
    }
    else
    {
      return -1;
    }
  }
?>

五、写一个函数,能够遍历一个文件下的所有文件和子文件夹

<?php  
  function my_scandir($dir)
  {
    $files = array();
    if($handle = opendir($dir))
    {
      while (($file = readdir($handle))!== false) 
      {
        if($file != '..' && $file != '.')
        {
          if(is_dir($dir."/".$file))
          {
            $files[$file]=my_scandir($dir."/".$file);
          }
          else
          {
            $files[] = $file;
          }
        }
      }

      closedir($handle);
      return $files;
    }
  }

  var_dump(my_scandir('../'));
?>

六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名

<?php
  function getExt($url)
  {
    $arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
    //'scheme' => string 'http' (length=4)
    //'host' => string 'www.sina.com.cn' (length=15)
    //'path' => string '/abc/de/fg.php' (length=14)
    //'query' => string 'id=1' (length=4)
    $file = basename($arr['path']);// basename函数返回路径中的文件名部分
    $ext = explode('.', $file);
    return $ext[count($ext)-1];
  }

  print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));

?>

七、实现中文字符串截取无乱码的方法

可使用mb_substr,但是需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

以上这篇PHP面试常用算法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
最令PHP初学者头痛的十四个问题
Jul 12 PHP
基于mysql的论坛(2)
Oct 09 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
Sep 23 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
Zend Framework分发器用法示例
Dec 11 PHP
php json相关函数用法示例
Mar 28 PHP
PHPstorm快捷键(分享)
Jul 17 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
TP5框架简单登录功能实现方法示例
Oct 31 PHP
微信红包随机生成算法php版
Jul 21 #PHP
php集成动态口令认证
Jul 21 #PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
Jul 21 #PHP
微信随机生成红包金额算法php版
Jul 21 #PHP
PHP简单读取PDF页数的实现方法
Jul 21 #PHP
基于PHP微信红包的算法探讨
Jul 21 #PHP
php中preg_replace_callback函数简单用法示例
Jul 21 #PHP
You might like
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
node.js中的fs.mkdirSync方法使用说明
2014/12/17 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
vue日期组件 支持vue1.0和2.0
2017/01/09 Javascript
js css自定义分页效果
2017/02/24 Javascript
tab栏切换原理
2017/03/22 Javascript
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
vue限制输入框只能输入8位整数和2位小数的代码
2019/11/06 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Django rest framework实现分页的示例
2018/05/24 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
django中ImageField的使用详解
2020/12/21 Python
酒吧员工的岗位职责
2013/11/26 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
企业指导教师评语
2014/04/28 职场文书
小学生倡议书范文
2014/05/13 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
爱牙日宣传活动总结
2015/02/05 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
MySQL中的隐藏列的具体查看
2021/09/04 MySQL