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 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
ThinkPHP实现ajax仿官网搜索功能实例
Dec 02 PHP
PHP5.3以上版本安装ZendOptimizer扩展
Mar 27 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
Dec 14 PHP
ThinkPHP实现简单登陆功能
Apr 28 PHP
IOS 开发之NSDictionary转换成JSON字符串
Aug 14 PHP
PHP实现动态创建XML文档的方法
Mar 30 PHP
php实现QQ小程序发送模板消息功能
Sep 18 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
PHP程序员必须知道的两种日志实例分析
May 14 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
模拟SQLSERVER的两个函数:dateadd(),datediff()
2006/10/09 PHP
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
mac下安装nginx和php
2013/11/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
查看python下OpenCV版本的方法
2018/08/03 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
this关键字的含义
2015/04/08 面试题
机械系大学毕业生推荐信
2013/11/27 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
建筑工程毕业生自我鉴定
2014/01/14 职场文书
小学数学国培感言
2014/03/10 职场文书
保护环境标语
2014/06/09 职场文书
爱晚亭导游词
2015/02/09 职场文书
严以律己学习心得体会
2016/01/13 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers