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下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
yii实现创建验证码实例解析
Jul 31 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
php基于CodeIgniter实现图片上传、剪切功能
May 14 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 02 PHP
PHP实现简单日历类编写
Aug 28 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
php tp验证表单与自动填充函数代码
2012/02/22 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
js异或加解密效果代码
2008/06/25 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
jquery控制select的text/value值为选中状态
2014/06/03 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
jquery常用操作小结
2014/07/21 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
npm 常用命令详解(小结)
2019/01/17 Javascript
Python使用贪婪算法解决问题
2019/10/22 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
2020/10/02 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
如何避免常见的6种HTML5错误用法
2017/11/06 HTML / CSS
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
个人求职信范文分享
2013/12/13 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
二手房购房意向书范本
2014/04/01 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
小学班主任培训方案
2014/06/04 职场文书
关于爱国的标语
2014/06/24 职场文书
2014年质量管理工作总结
2014/12/01 职场文书
学生检讨书怎么写
2015/05/07 职场文书
Redis高级数据类型Hyperloglog、Bitmap的使用
2021/05/24 Redis
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python