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中一个控制字符串输出的函数
Oct 09 PHP
用PHP书写安全的脚本代码
Feb 05 PHP
PHP仿盗链代码
Jun 03 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
php实现指定字符串中查找子字符串的方法
Mar 17 PHP
php自定义错误处理用法实例
Mar 20 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
PHP使用观察者模式处理异常信息的方法详解
Sep 24 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
ppk谈JavaScript style属性
2008/10/10 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
js中new一个对象的过程
2017/02/20 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
Node.js使用Angular简单示例
2018/05/11 Javascript
使用D3.js+Vue实现一个简单的柱形图
2018/08/05 Javascript
js实现左右轮播图
2020/01/09 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
基于Python os模块常用命令介绍
2017/11/03 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
python 多线程中join()的作用
2020/10/29 Python
详解canvas绘制网络字体几种方法
2019/08/27 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
社区中秋节活动方案
2014/01/29 职场文书
一年级语文教学反思
2014/02/13 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
绿色环保演讲稿
2014/05/10 职场文书
家长建议怎么写
2014/05/15 职场文书
商务经理岗位职责
2014/07/30 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书