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 相关文章推荐
snoopy 强大的PHP采集类使用实例代码
Dec 09 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
基于MySQL分区性能的详细介绍
May 02 PHP
基于php常用正则表达式的整理汇总
Jun 08 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
PHP根据传入参数合并多个JS和CSS文件的简单实现
Jun 13 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
laravel实现前后台路由分离的方法
Oct 13 PHP
tp5 实现列表数据根据状态排序
Oct 18 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中的字符编码转换函数用法示例
2014/10/20 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
Javascript 中的类和闭包
2010/01/08 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
2017/02/22 Javascript
详解基于webpack和vue.js搭建开发环境
2017/04/05 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
Python continue继续循环用法总结
2018/06/10 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python绘制漏斗图步骤详解
2019/03/04 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
行政监察建议书
2014/05/19 职场文书
环保小标语
2014/06/13 职场文书
公司应聘自荐书
2014/06/14 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
python实现简单区块链结构
2021/04/25 Python
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js